一文詳解matplotlib的配置檔案以及配置方式
歡迎關注“勇敢AI”公眾號,更多python學習、資料分析、機器學習、深度學習原創文章與大家分享,還有更多電子資源、教程、資料集下載。勇敢AI,一個專注於人工智慧AI的公眾號。
==================================================================================
一、matplotlib配置
我們使用matplotlib所畫出來的圖形中,會呈現出各種各樣的樣式,除了我們手動設定自定義的配置屬性以外,matplotlib自帶了一套配置方案以及各種預設的圖形配置資訊,幸運的是,幾乎所有的配置資訊都能夠通過一組全域性引數進行自定義,這些引數管理著影象的大小、subplot邊距、配色方案、字型、網格等一系列資訊。
二、matplotlibrc——matplotlib resource configurations 的配置方式
matplotlib的圖形配置方式有很多,主要是從以下三個方面進行配置的。
- 通過配置檔案進行配置——檢視+設定
- 通過rcParams['引數名']動態配置——檢視+設定
- 通過matplotlib.rc()函式配置
1、通過配置檔案進行配置——matplotlibrc
matplotlibrc是matplotlib的配置檔案,配置檔案分為幾個不同的級別,比如我們預設的是所有的圖形都是使用預設的配置,因為我們使用的是全域性的預設配置,但是如果我們希望,每一個專案都單獨使用一套不同的配置,或者是不同的使用者使用一套不同的配置,這就需要使用到區域性配置檔案。使用不同的配置引數的方式,是讓你能夠在不同的專案中使用不同的引數配置,不同的同事和專案之間分配配置模板。
matplotlib通過matplotrc檔案來進行配置,這個檔案根據他們的應用範圍可以有一下三個級別:
(1)當前工作目錄:程式碼執行的目錄,可以為目錄所包含的當前專案程式碼定製matplotlib配置項。配置檔案的名稱是matplotlibrc
在這個單獨的專案中,都是用這一套配置檔案,預設是沒有的,我們需要自己建立,怎麼建立呢?後面會講 到。
(2)使用者級配置檔案:即使用者目錄之下的.matplotlib/matplotlibrc檔案。通常是在使用者的$HOME中(也就是windows系統中的 Users\目錄)。比如我的使用者目錄為:C:\Users\XinAir\.matplotlib\matplotlibrc,有的可能沒有,同樣可以自 己為使用者建立配置檔案。可以呼叫matplotlib.get_configdir()命令獲取當前使用者的配置檔案目錄。
(3)安裝級配置檔案:簡裝matplotlib的時候在安裝路徑之下的配置檔案,通常在python的site-packags目錄下的matplotlib檔案 夾中的mpl-data資料夾之下,比如,我的電腦在:D:\ProgramData\Anaconda3\envs\tensorflow\Lib\site- packages\matplotlib\mpl-data\matplotlibrc
系統在畫圖的時候會按照(1)、(2)、(3)的順序進行配置檔案的尋找。
如果我們對上面的路徑不是特別清楚,我們可以通過程式設計的方式進行檢視,如下程式碼:
import matplotlib
print(matplotlib.get_backend()) #返回matplotlib的後端
print(matplotlib.get_cachedir()) #快取目錄
print(matplotlib.get_configdir()) #配置目錄
print(matplotlib.get_data_path()) #資料路徑
print(matplotlib.get_home()) #使用者目錄
執行結果為:
TkAgg #這裡預設的後端是TkAgg
C:\Users\XinAir\.matplotlib
C:\Users\XinAir\.matplotlib
D:\ProgramData\Anaconda3\envs\tensorflow\lib\site-packages\matplotlib\mpl-data
C:\Users\XinAir
配置檔案的格式:
既然涉及到自己建立配置檔案,那麼配置檔案的格式是什麼樣子呢,如何修改呢,我們可以開啟安裝目錄之下的matplotlibrc加以檢視,發現內容如下:
-------------------------------------------------------------------------------------------------------------------
#前面是以部分介紹資訊以及相關的後端、工具條、可互動性、時區等等一些的設定,此處省略了。。。。。。
#### LINES #線型屬性的設定
## See http://matplotlib.org/api/artist_api.html#module-matplotlib.lines for more
## information on line properties.
#lines.linewidth : 1.5 ## line width in points
#lines.linestyle : - ## solid line
#lines.color : C0 ## has no affect on plot(); see axes.prop_cycle
#lines.marker : None ## the default marker
#lines.markeredgewidth : 1.0 ## the line width around the marker symbol
#lines.markersize : 6 ## markersize, in points
#lines.dash_joinstyle : round ## miter|round|bevel
#lines.dash_capstyle : butt ## butt|round|projecting
#lines.solid_joinstyle : round ## miter|round|bevel
#lines.solid_capstyle : projecting ## butt|round|projecting
#lines.antialiased : True ## render lines in antialiased (no jaggies)
## The three standard dash patterns. These are scaled by the linewidth.
#lines.dashed_pattern : 3.7, 1.6
#lines.dashdot_pattern : 6.4, 1.6, 1, 1.6
#lines.dotted_pattern : 1, 1.65
#lines.scale_dashes : True
#markers.fillstyle: full ## full|left|right|bottom|top|none
#### PATCHES #圖形patch的屬性設定
## Patches are graphical objects that fill 2D space, like polygons or
## circles. See
## http://matplotlib.org/api/artist_api.html#module-matplotlib.patches
## information on patch properties
#patch.linewidth : 1 ## edge width in points.
#patch.facecolor : C0
#patch.edgecolor : k ## if forced, or patch is not filled
#patch.force_edgecolor : False ## True to always use edgecolor
#patch.antialiased : True ## render patches in antialiased (no jaggies)
--------------------------------------------------------------------------------------------------------------------------
從上面可以看見,配置檔案的格式一般為如下樣式:
--------------------------------------------------------------------------------------------------------------------------
####配置物件(四個#)
##相關的描述資訊(兩個#)
#屬性一 : 屬性值
#屬性二 : 屬性值
#屬性三 : 屬性值
-----------------------------------------------------------------------------------------------------------------------------
總結:配置物件可以是一下一些:
lines patches hatches boxplot font
text axes dates ticks grids
legend figure images contour plots errorbar plots
histogram plots acatter plots Agg rendering paths
saving figures
---------------------------------------------------------------------------------------------------------------------------------------------
2、通過rcParams['引數名']動態配置
(1)檢視到底有哪些自定義配置屬性可以設定
import matplotlib
from matplotlib.pylab import mpl
#print(mpl.rc_params()) #方式一
print(matplotlib.rc_params()) #方式二
print(matplotlib.rcParamsDefault) #方式三
print(matplotlib.rcParams) #方式四
上面四種方法是等價的。
(2)通過rcParams['屬性名']去設定,如下:
mpl.rcParams['lines.linewidth'] = 2
matplotlib.rcParams['lines.linewidth'] = 2
mpl.rcParams['lines.color'] = 'r'
matplotlib.rcParams['lines.color'] = 'r'
上面的 mpl.rcParams['屬性名']=屬性值 和 matplotlib.rcParams['屬性名']=屬性值 是等價的
3、通過rc()函式去配置相關屬性
mpl.rc('lines', linewidth=4, color='g')
plt.rc('lines', linewidth=4, color='g')
matplotlib.rc('lines', linewidth=4, color='g')
總結:上面的三種方式等價,即通過 mpl 、plt 、matplotlib三者的 rc()方法均是等價的,該方法的第一個引數需要指定改變的物件,具體有哪些物件,上面已經說過了,然後設定相關的屬性值。
三、matplotlib的相關補充
1、關於配置檔案的
mpl.rcdefaults() # 恢復預設引數
mpl.cr_file() #從已有的檔案更新
2、關於畫圖後端引擎的
matplotlib的後端引擎有以下一些:
GTKAgg | Agg渲染器輸出到GTK繪圖面板(需要PyGTK) |
GTK | GDK渲染器輸出到GTK繪圖面板(不推薦,需要PyGTK) |
GTKCairo | Cairo渲染器輸出到GTK繪圖面板(需要PyGTK) |
WXAgg | Agg渲染器輸出到wxWidgets繪圖面板(需要wxPython) |
WX | 原生wxWidgets繪圖輸出到wxWidgets繪圖面板(不推薦,需要wxPython) |
TkAgg | Agg渲染器輸出到Tk繪圖面板(需要Tkinter) |
QtAgg | Agg渲染器輸出到Qt繪圖面板(不推薦,請使用Qt4Agg,需要PyQt) |
Qt4Agg | Agg渲染器輸出到Qt4繪圖面板(需要PyQt4) |
FLTKAgg | Agg渲染器輸出到FLTK繪圖面板(需要pyFLTK, 使用不是很廣,考慮使用TKAgg,GTKAgg,WXAgg,或者QT4Agg替代) |
macosx | Cocoa渲染器在osx上。(目前在非互動式模式缺少阻塞show()行為) |
3、關於中文與負號顯示的相關設定
使用matplotlib的pyplot時,是支援unicode的,但預設字型是英文字型, 不支援中文字型,故而需要設定
(1)方法一:通過設定rcParams
from matplotlib.pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] #顯示中文
mpl.rcParams['axes.unicode_minus']=False #顯示負號
(2)方法二:通過使用matplotlib裡面的font_manager工具,主要步驟如下:
第一步:匯入font_manager:
import matplotlib.font_manager as fm
第二步:找到中文字型在電腦中的位置,匯入中文字型庫
zh_font = fm.FontProperties(fname='C:\Windows\Fonts\msyh.ttc') # 字型位置,msyh.ttc是微軟雅黑字型
方法二相對於方法一而言,沒有那麼方便,方法一是將圖形中所設定的中文一次性全部顯示出來,但是方法二不能,它需要將標題、座標名稱、刻度單獨設定,不能一次性設定完,如下所示:
第三步:單獨針對需要設定中文的位置進行設定
a. 圖例中出現中文:
plt.plot(x,y, 'g-',label='一條曲線')
plt.legend(prop=zh_font) #設定圖例的中文顯示
b. title和橫縱座標等地方出現中文:
plt.xlabel('性別',fontproperties=zhfont1) #設定X軸名稱
plt.ylabel('人數',fontproperties=zhfont1) #設定Y軸標題
plt.title('直方圖',fontproperties=zhfont1) #設定圖形的名稱
plt.xticks( (0,1),('男','女') ,fontproperties=zhfont1) #設定標籤為中文
如果有希臘字母時,使用雙"$...$"符號,如plt.xlabel(u'$ω$')
(3)方法三:
直接修改全域性的安裝目錄下的matplotlibrc檔案
第一步:修改matplotlibrc
檔案
使用任何一個檔案編輯器(推薦vscode),修改該檔案,通過ctrl+f
搜尋找到
#axes.unicode_minus : True ## use unicode for the minus symbol
#font.family : sans-serif
#font.sans-serif : DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
分別修改為以下三行
axes.unicode_minus : False ## use unicode for the minus symbol
font.family : Microsoft YaHei
font.sans-serif : Microsoft YaHei, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
上面修改的三行都需要刪除第一個#,取消註釋
- 第一行,修改True為False,是為了正常顯示負號
- 第二行和第三行是為了使用微軟雅黑作為預設字型
第二步:刪除快取
使用下面的程式碼,獲取快取資料夾.
import matplotlib
print(matplotlib.get_cachedir())
我的輸出為
C:\Users\xinair\.matplotlib
所以,一般在使用者目錄的matplotlib
,刪除該目錄下的所有檔案
將上面的兩項刪除,然後重啟Python即可(意思是關閉所有正在執行的Python視窗,然後重新開啟,要不然無法生效)
上面三種方法均可以實現中文顯示,推薦使用第一種,簡單方便,第二種設定更加靈活,第三種不太推薦,因為全域性的設定會破壞原本的安裝結構,而又不是每一個專案都需要顯示中文的,不太推薦這個。
注意事項:怎麼知道那一種字型的名稱呢?
在使用第二種或者是第三種方法的時候,需要知道字型的名稱,比如msyh.ttc,simsun.ttc,當我們開啟windows中的字型資料夾,發現並找不到或者是名字又不是一樣的,怎麼辦呢?以“微軟雅黑”為例。
在windows的Fonts資料夾下,找到微軟雅黑,發現顯示的是中文 微軟雅黑 四個漢字,將其複製,然後貼上到matplotlib未知的ttf資料夾中,即
D:\ProgramData\Anaconda3\envs\tensorflow\Lib\site-packages\matplotlib\mpl-data\fonts\ttf
這是專門存放字型的資料夾,貼上之後發現,它本質上就是msyh.ttc字型檔案,現在就方便使用了。
下面是常用的一些中文字型的對應關係:
Fonts資料夾下面的中文名稱 | 複製到 tt f裡面的名稱 |
宋體 | simsun.ttc |
仿宋 | simfang.ttf |
黑體 | simhei.ttf |
楷體 | simkai.ttf |
微軟雅黑 | msyh.ttc |
等線 | Deng.ttf |
此外,對於拉丁文字型、藏語字型、朝語字型、日語字型等的處理方式是一樣的。