1. 程式人生 > >一文詳解matplotlib的配置檔案以及配置方式

一文詳解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

上面修改的三行都需要刪除第一個#,取消註釋

  1. 第一行,修改True為False,是為了正常顯示負號
  2. 第二行和第三行是為了使用微軟雅黑作為預設字型

第二步:刪除快取

使用下面的程式碼,獲取快取資料夾.

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

此外,對於拉丁文字型、藏語字型、朝語字型、日語字型等的處理方式是一樣的。