天天看點

Seaborn 繪圖中設定字型及大小

作者:博學多才的葉慢慢

大家好最近在使用Seaborn繪圖時,把我整不會了。想着Seaborn 是基于 Matplotlib,習慣于使用Matplotlib那一套設定字型大小的方法,但在使用Seaborn時,多少有一些不同。今天讓我們一起看看吧~

設定 seaborn 繪圖中的字型

Seaborn 基于 Matplotlib,Matplotlib 基于 Python,Python 運作于電腦系統中。

是以,要在 Seaborn 中使用某款字型,該字型要滿足以下條件:

  1. 字型已安裝在系統中;
  2. Python 能檢索到此字型;
  3. Matplotlib 字型緩存中能檢索到此字型;
  4. 繪圖時在 Seaborn 中設定使用該字型。

1.1 在電腦上安裝字型

以「文泉驿微米黑」字型為例,下載下傳到的字型安裝包為「文泉驿微米黑.ttf」,輕按兩下會自動打開系統自帶的字型管理器,點選安裝既可。

以上操作在 Windowns 10 和 Ubuntu 上都可實作,Mac OS 沒用過,應該也差不多流程。

1.2 讓 Python 能檢索到字型

如果安裝字型時沒有運作 Python,應該就不用做什麼。

如果安裝字型時正在運作 Python,則需要重新開機 Python 環境。用 Jupyter Notebook,直接重新開機核心既可。

1.3 更新 Matplotlib 字型緩存

不是系統安裝了字型就能在 Seaborn 和 Matplotlib 中使用,需要先更新 Matplotlib 的字型緩存。代碼如下。這裡隻需用到matplotlib.font_manager包,由于後面要做圖,這裡同時加載pandas、seaborn、matplotlib。

import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
import matplotlib.font_manager as font_manager
%matplotlib inline

font_manager._rebuild()
           

1.4 在 Seaborn 中使用字型

要使用字型,首先要知道字型名稱。用以下指令可以檢視 Matplotlib 的字型緩存中的字型名稱。

for font in font_manager.fontManager.ttflist:
    print(font)


<Font 'STIXSizeOneSym' (STIXSizOneSymReg.ttf) normal normal 400 normal>
<Font 'cmss10' (cmss10.ttf) normal normal 400 normal>
<Font 'STIXNonUnicode' (STIXNonUni.ttf) normal normal 400 normal>
<Font 'STIXSizeFourSym' (STIXSizFourSymBol.ttf) normal normal 700 normal>
<Font 'STIXSizeOneSym' (STIXSizOneSymBol.ttf) normal normal 700 normal>
<Font 'STIXSizeFourSym' (STIXSizFourSymReg.ttf) normal normal 400 normal>
<Font 'DejaVu Sans Mono' (DejaVuSansMono.ttf) normal normal 400 normal>
<Font 'STIXGeneral' (STIXGeneralItalic.ttf) italic normal 400 normal>
...
           

以「文泉驿微米黑」為例,找到字型名稱叫「WenQuanYi Micro Hei」。之後在字型參數中可指定為此值。

Seaborn 是基于 Matplotlib,是以設定 Seaborn 字型參數,就是設定 Matplotlib。以下指令檢視 Matplotlib 的預設字型。

print(plt.rcParams["font.family"])
print(plt.rcParams['font.sans-serif'])
['sans-serif']
['DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Serif', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avant Garde', 'sans-serif']
           

rcParams 是 Matplotlib 運作時的參數配置字典,包含各項設定。以上列印出與字型設定相關的兩個鍵的值。

其中 font.family 的值為預設使用的字型族,目前為 sans-serif。Matplotlib 推薦的字型族隻有四種 :fantasy, monospace, sans-serif, serif。

font.sans-serif 的值為字型族 sans-serif 所包含的字型名稱的清單,繪圖時 Matplotlib 會在該清單中從前往後順序優先使用靠前的字型。

是以要使用指定的字型,可以将字型名加入字型族 sans-serif 所包含的字型清單中,放在清單最前,然後指派給font.sans-serif。

其實還有兩種設定字型的辦法,但不推薦:

  1. 将 font.family 的值改為指定字型名稱。不推薦原因:這裡更改的是預設字型族,而 Matplotlib 推薦的字型族隻有四種。而且一個字型族包含若幹字型,當優先使用字型無法顯示内容, Matplotlib 會使用次優先字型。如果将字型族指定為單一字型,那 Matplotlib 也就隻能使用這一種字型。
  2. 使用 seaborn.set() 函數中的 font 參數指定字型。不推薦原因:這個方法其實修改的也是 font.family 字型族,不推薦理由同上。

辦法找到了,下面簡單實操。具體設定就是,通過使用 seaborn.set() 函數中的 rc 參數,來修改 Matplotlib 的 rcParams 中的 sans-serif 字型清單。

tips = pd.read_csv('seaborn-data-master/tips-zh.csv')
rc = {'font.sans-serif': ['WenQuanYi Micro Hei', 'DejaVu Sans', 'Bitstream Vera Sans']}
sns.set(context='notebook', style='ticks', rc=rc)
g = sns.relplot(x='賬單', y='小費', data=tips)
           
Seaborn 繪圖中設定字型及大小

設定 Seaborn 中字型大小

Seaborn 繪圖中設定字型大小的方法有兩種:

  • 使用 seaborn.set() 函數中的 font_scale 參數,此方法以標明的 seaborn 樣式中的字型大小為基準,将字型放大指定的倍數。
  • 在各種文字設定函數中,使用 fontsize 參數指定字型大小。

2.1 使用 font_scale參數設定字型大小

很簡單,給 font_scale 指派一個數,seaborn 會自動放大字型。

簡單示例如下圖及代碼。圖中将内置樣式的字型放大2倍。

sns.set(context='notebook', style='ticks', font_scale=2, rc=rc)
ax = sns.scatterplot(x='賬單', y='小費', hue='性别', data=tips)
           
Seaborn 繪圖中設定字型及大小

2.2 使用 fontsize參數設定字型大小

Seaborn 繪制圖像分為 FacetGrid 級圖 和 ax 級圖。此方法隻适用于 ax 級圖。

在以下函數中使用 fontsize 參數指定不同位置的字型的大小,ax 變量為 ax 級圖對象,以設定為 14 号字為例:

  • ax.set_xticklabels(fontsize=14),設定X座标軸刻度标簽字型
  • ax.set_yticklabels(fontsize=14),設定Y座标軸刻度标簽字型
  • ax.set_ylabel(fontsize=14),設定Y坐标軸标簽字型
  • ax.set_xlabel(fontsize=14),設定X坐标軸标簽字型
  • ax.set_title(fontsize=14),設定标題字型
  • ax.legend(title = "性别", fontsize = 14, title_fontsize = 14),設定圖例标題、圖例标題字型大小、圖例字型大小

簡單實操見下圖及代碼。

ax = sns.scatterplot(x='賬單', y='小費', hue='性别', data=tips)
x = [-40, -20, 0, 20, 40]
ax.set_xticks(x)
xlabs = [-40, -20, 0, 20, 40]
ax.set_xticklabels(xlabs, fontsize=14) #設定X座标軸刻度标簽字型
y = [0, 2, 4, 6, 8, 10]
ax.set_yticks(y)
ylabs = [0, 2, 4, 6, 8, 10]
ax.set_yticklabels(ylabs, fontsize=14) #設定Y座标軸刻度标簽字型
ax.set_ylabel('小費', fontsize=14) #設定Y坐标軸标簽字型
ax.set_xlabel('賬單', fontsize=14) #設定X坐标軸标簽字型
ax.set_title('簡單示例圖', fontsize=14) #設定标題字型
ax.legend(title = "性别", fontsize = 12, title_fontsize = 14) #設定圖例标題、圖例标題字型大小、圖例字型大小
           
Seaborn 繪圖中設定字型及大小
作者:王澈

繼續閱讀