matplotlib 無法顯示中文字體的解決方法


轉載自:https://www.cnblogs.com/taceywong/p/5468224.html

使用以下方法中的一種,添加中文字體后,在pyplot.legend方法中設置prop等於設置好的字體,在pyplot.xlabel中設置FontProperties等於新字體。

 

matplotlib的強大無需我去言說,但它對使用中文的我來說卻有一點瑕疵,那就是——在默認狀態下,matplotlb無法在圖表中使用中文。

在網上查找了一些資料,發現matplotlib本身是支持Unicode的,只不過默認情況下matplotlib使用自帶的字體,而自帶的字體中沒有中文字體。這樣要它支持中文的思路就有了——給maplotlib添加中文字體。

思路1:用某種中文字體替換掉matplotlib的默認字體

這屬於一種破壞性質的方法,不推薦。這樣的方法,同樣的代碼無法在不同的環境中使用,每次更換環境你必須得重新"Hack"一次。我也沒有使用這種方法。

思路2:使用matplotlib的字體管理器指定字體文件

matplotlib中有一個字體管理器——matplotlib.Font_manager,通過該管理器的方法——matplotlib.Font_manager.FontProperties(fname)可以指定一個ttf字體文件作為圖表使用的字體。這樣,只要我們傳入Unicode字符串,我們就可以想用什么字體就用什么字體了。示例代碼如下:

# coding:utf-8 from pylab import * import random myfont = matplotlib.font_manager.FontProperties(fname="Light.ttc") mpl.rcParams['axes.unicode_minus'] = False t = arange(-5*pi, 5*pi, 0.001) y = sin(t)/t my_post = plt.plot(t, y) plt.title(u'matplotlib中文顯示測試——Tacey Wong',fontproperties=myfont) plt.xlabel(u'這里是X坐標',fontproperties=myfont) plt.ylabel(u'這里是Y坐標',fontproperties=myfont) plt.show()

代碼中第六行通過fname指定字體文件,第七行的作用是為了消除更換為unicode字體之后0、負數之類的顯示異常。之后所有使用中文字體的地方只字符串都以u""的形式出現,並指定fontproperties屬性為我們的指定的myfont就行了。該示例代碼的圖表生成結果如下:

這種辦法的好處是想用什么字體,指出這個字體文件的路徑名字就可以了。只要是ttf兼容的,都可以使用。

思路3:使用系統中安裝的字體

前面說了,matplotlib一般使用的是非系統字體,我們在這里可以指定它使用我們系統中已經安裝的某一個字體,這里我們需要的不是像“宋體、仿宋”這樣的名稱,也不是“xxx.ttf”這樣的字體文件名稱,二十需要我們的系統可以識別的字體名稱。

Linux中可以使用命令——fc-list :lang=zh來查看我們系統安裝的中文字體系統識別的名稱,Droid Sans Fallback即為Ubuntu系統自帶的一款中文字體,在這里我們使用這個字體作為matplotlib使用的系統字體。示例代碼如下:

# coding:utf-8 def conf_zh(font_name): from pylab import mpl mpl.rcParams['font.sans-serif'] = [font_name] mpl.rcParams['axes.unicode_minus'] = False def run(): from pylab import * import random t = arange(-5*pi, 5*pi, 0.001) y = sin(t)/t my_post = plt.plot(t, y) plt.title(u'matplotlib中文顯示測試——Tacey Wong') plt.xlabel(u'這里是X坐標') plt.ylabel(u'這里是Y坐標') plt.show() if __name__ == "__main__": conf_zh("Droid Sans Fallback") run()

這樣的方法有一個好處就是可以將指定字體的部分單獨提取作為一個函數,每次繪圖之前調用一次就行了,不用每次都指定fontproperties屬性。

該示例的圖表生成結果如下:

如果不是系統自帶的字體安裝之后是否可以用這種方法呢?答案是肯定的,需要的只是把傳入的名字改成自己安裝的字體系統所識別的名字,也就是將conf_zh("Droid Sans Fallback")改為conf_zh("自己安裝的字體系統所識別的名字")。下面就是使用一個自安裝的字體的生成結果(conf_zh("Li Xuke Comic Font")):

這種方法的好處是不需要額外的配置fontproperties屬性,配置一次,后續代碼和用英文字符串沒什么兩樣(如果不需要配置字體的其他屬性的話,這種方法很方便)

總結

后兩種方法各有有利之處。更多的字體配置可以可以修改matplotlib的配置文件。用下面的代碼查看該配置文件的位置在哪里:

import matplotlib print matplotlib.matplotlib_fname()

該命令會返回配置文件地址,如,在我的機子上返回了下面的結果

/etc/matplotlibrc

matplotlibrc即為matplotlib的配置文件,里面不只有字體配置,感興趣的話可以看一下。下面是部分配置項截圖:

有興趣的可以查看一下里面的內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM