Matplotlib中文亂碼的兩種詳細(xì)解決方案
前言
Matplotlib 默認(rèn)不支持中文字體,這因?yàn)?Matplotlib 只支持 ASCII 字符,但中文標(biāo)注更加符合中國(guó)人的閱讀習(xí)慣。因此,本節(jié)重點(diǎn)講解如何在 Windows 環(huán)境下讓 Matplotlib 顯示中文。
Matplotlib中文亂碼
當(dāng)不對(duì) Matplotlib 進(jìn)行設(shè)置,而直接使用中文時(shí),繪制的圖像會(huì)出現(xiàn)中文亂碼。下面是一個(gè)含有中文亂碼的折線圖:

從上圖可以看出,本應(yīng)該顯示在紅框內(nèi)的中文字體沒有顯示出來(lái)(紅框是自己標(biāo)注出來(lái)的),下面給出了兩種解決方案:第一種是臨時(shí)解決方案,第二種是一勞永逸的解決方案。
重寫配置文件
通過臨時(shí)重寫配置文件的方法,可以解決 Matplotlib 顯示中文亂碼的問題,代碼如下所示:
import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"]=["SimHei"] #設(shè)置字體 plt.rcParams["axes.unicode_minus"]=False #該語(yǔ)句解決圖像中的“-”負(fù)號(hào)的亂碼問題
將上述代碼添加到您的繪圖程序中,即可解決中文亂碼的問題。這是一種非常靈活、便捷的解決方法。完整的程序代碼如下:
#繪制折線圖
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] #設(shè)置字體
plt.rcParams["axes.unicode_minus"]=False #正常顯示負(fù)號(hào)
year = [2017, 2018, 2019, 2020]
people = [20, 40, 60, 70]
#生成圖表
plt.plot(year, people)
plt.xlabel('年份')
plt.ylabel('人口')
plt.title('人口增長(zhǎng)')
#設(shè)置縱坐標(biāo)刻度
plt.yticks([0, 20, 40, 60, 80])
#設(shè)置填充選項(xiàng):參數(shù)分別對(duì)應(yīng)橫坐標(biāo),縱坐標(biāo),縱坐標(biāo)填充起始值,填充顏色
plt.fill_between(year, people, 20, color = 'green')
#顯示圖表
plt.show()
輸出結(jié)果如下:

不過上述解決方案適用于所有操作系統(tǒng),其唯一弊端是每編寫一個(gè)繪圖程序就要添加一次相同的代碼。
修改配置文件
下面介紹第二種方式:通過直接修改配置文件的方法,可以一勞永逸的解決 Matplotlib 的中文亂碼問題。注意此過程在 Windows 環(huán)境下進(jìn)行。
Matplotlib 從配置文件 matplotlibrc 中讀取相關(guān)配置信息,比如字體、樣式等,因此我們需要對(duì)該配置文件進(jìn)行更改。首先查看 matplotlibrc 所在的目錄,使用如下代碼確定目錄位置:
import matplotlib matplotlib.matplotlib_fname()
輸出結(jié)果:
D:\python\python37\lib\site-packages\matplotlib\mpl-data\matplotlibrc
然后修改配置文件 matplotlibrc。打開配置文件后,找到以下信息:
#font.family: sans-serif
#font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
將上述配置項(xiàng)前面的#去掉,并修改的配置項(xiàng),如下所示:
font.family : Microsoft YaHei, sans-serif font.serif: Microsoft YaHei, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
注意,由于版本問題,上述內(nèi)容配置信息可能存在一些差異,請(qǐng)自動(dòng)忽略。
最后,在以下目錄中復(fù)制中文字體微軟雅黑:
C:\Windows\Fonts\Microsoft YaHei UI
復(fù)制完成后,將字體粘貼至以下路徑文件中:
D:\python\python37\lib\site-packages\matplotlib\mpl-data\fonts\ttf
字體粘貼后會(huì)出現(xiàn)一個(gè) MSYH.ttc 的字體文件,如下所示:

編寫如下代碼進(jìn)行測(cè)試:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-8, 8, 1024)
y1 = 0.618 * np.abs(x) - 0.8 * np.sqrt(64 - x ** 2)
y2 = 0.618 * np.abs(x) + 0.8 * np.sqrt(64 - x ** 2)
plt.plot(x, y1, color='r')
plt.plot(x, y2, color='r')
plt.title("測(cè)試",fontsize=20,color="b")
plt.show()
如果你對(duì)自己編寫的程序沒有強(qiáng)烈的“潔癖”,可以接受重復(fù)的代碼,那么建議您選擇第一種解決方法,因?yàn)檫@種方法靈活、輕便。當(dāng)然您也可以選擇第二種方式,一勞永逸的解決中文亂碼問題。
總結(jié)
到此這篇關(guān)于Matplotlib中文亂碼的兩種詳細(xì)解決方案的文章就介紹到這了,更多相關(guān)Matplotlib中文亂碼解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析Python的web.py框架中url的設(shè)定方法
web.py是Python的一個(gè)輕量級(jí)Web開發(fā)框架,這里我們來(lái)淺析Python的web.py框架中url的設(shè)定方法,需要的朋友可以參考下2016-07-07
在PYQT5中QscrollArea(滾動(dòng)條)的使用方法
今天小編就為大家分享一篇在PYQT5中QscrollArea(滾動(dòng)條)的使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-06-06
簡(jiǎn)單談?wù)凱ython中的json與pickle
下面小編就為大家?guī)?lái)一篇簡(jiǎn)單談?wù)凱ython中的json與pickle。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-07-07
PyQt5實(shí)現(xiàn)簡(jiǎn)易計(jì)算器
這篇文章主要為大家詳細(xì)介紹了用PyQt5開發(fā)一個(gè)簡(jiǎn)易的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
使用Python實(shí)現(xiàn)跳一跳自動(dòng)跳躍功能
這篇文章主要介紹了使用Python實(shí)現(xiàn)跳一跳自動(dòng)跳躍功能,本文圖文并茂通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
基于Python執(zhí)行dos命令并獲取輸出的結(jié)果
這篇文章主要介紹了基于Python執(zhí)行dos命令并獲取輸出的結(jié)果,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
基于Pytorch的神經(jīng)網(wǎng)絡(luò)之Regression的實(shí)現(xiàn)
本文主要介紹了基于Pytorch的神經(jīng)網(wǎng)絡(luò)之Regression的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

