Pandas 無法顯示中文問題 解決方案
Pandas在繪圖時,會顯示中文為方塊,主要原因有二: matplotlib 字體問題seaborn 字體問題
(實際上,matplotlib是支持unicode編碼的,中文亂碼得主要問題是沒有找到合適的中文字體,在matplotlib的配置文件中,可以看到字體的默認設置如下:
#font.family : sans-serif
#font.sans-serif : Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
並沒有中文字體,所以我們只要手動添加中文字體的名稱就可以了,不過並不是添加我們熟悉的“宋體”或“黑體”這類的名稱,而是要添加字體管理器識別出的字體名稱,matplotlib自身實現的字體管理器在文件font_manager.py中,自動生成的可用字體信息在保存在文件fontList.cache里,可以搜索這個文件查看對應字體的名稱,例如simhei.ttf對應的名稱為’SimHei’,simkai.ttf對應的名稱為’KaiTi_GB2312’等。因此我們只要把這些名稱添加到配置文件中去就可以讓matplotlib顯示中文,修改的方法有兩種:)
一. 直接修改配置文件matplotlibrc:
1.在配置文件中找到font.sans-serif的設置,然后添加需要的中文字體名稱,例如:
font.sans-serif : SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
例如:mpl.rcParams['font.sans-serif'] = ['SimHei']
2.但是如果我們橫坐標有負半軸得值,‘-'值得話,我們得符號會不見,很明顯,這不是程序的錯誤,而是由於更改了字體導致顯示不出負號,
在配置文件中我們可以在axes相關設置里找到如下設置:
#axes.unicode_minus : True
可見默認情況下采用的是unicode的minus,看來我們選擇的字體對這點支持不夠,所以只要把它設置為False就可以了
例如:mpl.rcParams['axes.unicode_minus'] = False
import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['KaiTi'] mpl.rcParams['font.serif'] = ['KaiTi'] # mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示為方塊的問題,或者轉換負號為字符串 import seaborn as sns sns.set_style("darkgrid",{"font.sans-serif":['KaiTi', 'Arial']}) #這是方便seaborn繪圖得時候得字體設置
運行效果展示:


matplotlib 解決方案一 動態修改配置:
代碼和第一部分的前半部分一致
import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['KaiTi'] mpl.rcParams['font.serif'] = ['KaiTi'] # mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示為方塊的問題,或者轉換負號為字符串
matplotlib 解決方案二 設置自定義字體:
import numpy as np import pylab as pl import matplotlib.font_manager as fm myfont = fm.FontProperties(fname=r'D:\Fonts\simkai.ttf') # 設置字體 t = np.arange(0.0,2.0 * np.pi,0.01) # 自變量取值范圍 s = np.sin(t) # 計算正弦函數值 z = np.cos(t) # 計算余弦函數值 pl.plot(t,s,label='正弦') pl.plot(t,z,label='余弦') pl.xlabel('x-變量',fontproperties=myfont,fontsize=24) #設置標簽 pl.ylabel('y-正弦余弦函數值',fontproperties=myfont,fontsize=24) pl.title('sin-cos函數圖像',fontproperties=myfont,fontsize=32) #圖像標題 pl.legend(prop=myfont) pl.show()
運行結果展示:

win自帶字體庫路徑
- C:\Windows\Fonts\ 內含大量字體
- 注意在該文件夾下,字體文件的名字和其他文件夾下顯示的不一致,請使用右鍵屬性-常規中文件名,或者使用拷貝到其他文件夾后顯示的字體文件名字
參考
- Matplotlib輸出中文顯示問題,內含mac操作系統字體庫https://my.oschina.net/u/1180306/blog/279818
- github的帖子,pandas無法顯示中文的問題https://github.com/mwaskom/seaborn/issues/1009
