Pandas matplotlib 無法顯示中文


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

 


免責聲明!

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



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