在很長一段時間里用Python繪圖,matplotlib都不能很好的顯示中文,起初是認為我的pycharm里的設置問題,但是發現同樣的問題在spyder里也同樣的出現。
????????一共有兩種解決方案,我強烈推薦第一種,因為更為方便,繪圖時不用再寫別的參數,調用一次即可,第二種方法也會寫出來但是更多的是作為了解,主要因為相比之下太麻煩
方法一:
示例:繪制每月的商品數量
- X軸月份顯示為中文
- 增加X軸Y軸中文,圖標標題
from matplotlib import pyplot as plta = ["一月份","二月份","三月份","四月份","五月份","六月份"]b=[56.01,26.94,17.53,16.49,15.45,12.96]plt.figure(figsize=(20,8),dpi=80)plt.bar(range(len(a)),b)#繪制x軸
plt.xticks(range(len(a)),a)plt.xlabel("月份")
plt.ylabel("數量")
plt.title("每月數量")plt.show()
不出意外繪制出來的圖是這樣的。。。。。
繪制出來的圖片,在所有應該顯示為中文的地方均顯示亂碼
之前一直以為是系統中字符集支持的問題,其實并不是這樣,根本原因是matplotlib內置的原因,直到我知道了?matplotlib.rc?這個方法,其實這個我也不太會用,那么我們看一下這個的源碼寫的是該如何使用(學會看源碼真的很重要!!)
其實報錯只有一個原因就是他沒有這個字體,雖然電腦里有這個字體但是不代表matplotlib里也有這個字體,所以解決matplotlib中的中文顯示問題主要就是要找到它所內置支持的字體,那么我們首先查看一下它的內置字體,運行以下代碼查看所支持的字體
# 查詢當前系統所有字體
from matplotlib.font_manager import FontManager
import subprocessmpl_fonts = set(f.name for f in FontManager().ttflist)print('all font list get from matplotlib.font_manager:')
for f in sorted(mpl_fonts):print('\t' + f)
運行后他會顯示出所有支持的字體,大約100多種。。。。具體的我就不一一列舉了
但是你會發現這個都是英文字體啊,中文字體在哪里,其實我當時也非常困擾,但是細心的我發現了其中的奧秘,>>>其實他是有中文的只不過是用拼音寫的....<<<
其中你會發現有如下字體:
- DengXian
- FangSong
- KaiTi
- LiSu
- YouYuan
- Adobe Fan Heiti Std
- Adobe Fangsong Std
- Adobe Heiti Std
- Adobe Kaiti Std
- (到這里,我隨便選了一個就能跑了)
from matplotlib import pyplot as plt
#新增加的兩行
import matplotlib
matplotlib.rc("font",family='YouYuan')a = ["一月份","二月份","三月份","四月份","五月份","六月份"]b=[56.01,26.94,17.53,16.49,15.45,12.96]plt.figure(figsize=(20,8),dpi=80)plt.bar(range(len(a)),b)#繪制x軸
plt.xticks(range(len(a)),a)plt.xlabel("月份")
plt.ylabel("數量")
plt.title("每月數量")plt.show()
完美支持,也就是增加了兩行代碼就解決了中文的顯示問題,歸根到底還是很多沒沒有找到matplotlib所支持的內置字體方法,或是找到了不知道怎么用
方法二:
找到字體的所在路徑
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
但是他有一個弊端就是在每個圖上都需要在多家個參數調用才行,否則的話就會顯示不出來
plt.xticks(range(len(a)),a,fontproperties=my_font)plt.xlabel("月份",fontproperties=my_font)
plt.ylabel("數量",fontproperties=my_font)
plt.title("每月數量",fontproperties=my_font)