matplotlib 中文_详解Matplotlib中文字符显示问题
在用matplotlib進行繪圖時,如果在繪制過程中會用到中文,則默認情況下會出現(xiàn)字體警告,中文字符顯示為方框或亂碼的形式,我們這里將介紹多種解決方案。
02
目錄:
1.中文字體顯示問題
2.幾種解決方案
2.1.在繪圖代碼中設(shè)置全局字體
2.2.在繪圖代碼中設(shè)置局部字體
2.3.修改本機字符默認配置字體
2.4.自動區(qū)別系統(tǒng)然后選擇字體
3.其他
3.1.platform模塊
3.2.常見中文字體文件名
1.中文字體顯示問題
在用matplotlib進行繪圖時,如果在繪制過程中會用到中文,則默認情況下會出現(xiàn)字體警告,中文字符顯示為方框或亂碼的形式,具體見下方案例:
import?matplotlib.pyplot?as?pltimport?numpy?as?np
#?Data?for?plotting
t?=?np.arange(-1.0,?1.0,?0.01)
s?=?1?+?np.sin(2?*?np.pi?*?t)
fig,?ax?=?plt.subplots()
ax.plot(t,?s)
ax.set(xlabel='時間?(s)',?ylabel='voltage?(mV)',
???????title='簡單的標題')
plt.show()
中文亂碼C:\Users\Gdc\anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py:238:?RuntimeWarning:?Glyph?31616?missing?from?current?font.
??font.set_text(s,?0.0,?flags=flags)
...
我們可以看到在警告信息中提示“missing from current font”,直譯就是“在當前字體中缺少(中文字符)”,大概含義就是默認的字體中不含中文字符。
對于這類問題,核心就是設(shè)置繪制圖片時的字體參數(shù)包含全部的需要用到的字符。
2.幾種解決方案
我們在解決中文字符顯示問題時,有兩類方案多種方式:方案1,在繪圖代碼中設(shè)置全局字符顯示字體;方案2,在繪圖代碼中設(shè)置局部字體;方案3,修改本機字符默認配置的字體。
2.1.在繪圖代碼中設(shè)置全局字體
rcParams修改 font.sans-serif 或 font.family 對應(yīng)字體
#?以下代碼從全局設(shè)置字體為SimHei(黑體),解決顯示中文問題【W(wǎng)indows】#?設(shè)置font.sans-serif?或?font.family?均可
plt.rcParams['font.sans-serif']?=?['SimHei']
#?plt.rcParams['font.family']=['SimHei']
#?解決中文字體下坐標軸負數(shù)的負號顯示問題
plt.rcParams['axes.unicode_minus']?=?False?
由于mac電腦默認沒有SimHei(黑體)字體,大家可以下載安裝改字體或者修改為系統(tǒng)自帶的字體如Arial Unicode MS,如下:
#?以下代碼從全局設(shè)置字體為Arial?Unicode?MS,解決顯示中文問題【mac】#?設(shè)置font.sans-serif?或?font.family?均可
plt.rcParams['font.sans-serif']?=?['Arial?Unicode?MS']
#?plt.rcParams['font.family']=['Arial?Unicode?MS']
#?解決中文字體下坐標軸負數(shù)的負號顯示問題
plt.rcParams['axes.unicode_minus']?=?False?
rc方法,其實和設(shè)置rcParams 基本等效
#?設(shè)置font字典為?SimSun(宋體),大小為12(默認為10)font?=?{'family'?:?'SimSun',
????????'size'??:?'12'}
#?設(shè)置?字體
plt.rc('font',?**font)
#?解決中文字體下坐標軸負數(shù)的負號顯示問題????????
plt.rc('axes',?unicode_minus=False)?
!! 比如:rc('lines', linewidth=2, color='r')等效于以下:
rcParams['lines.linewidth']?=?2rcParams['lines.color']?=?'r'
2.2.在繪圖代碼中設(shè)置局部字體
FontProperties對象,這種情況下 不需要額外 處理負號 問題
import?matplotlib.pyplot?as?pltimport?numpy?as?np
#?引入matplotlib字體管理?FontProperties
from?matplotlib.font_manager?import?FontProperties
#?設(shè)置我們需要用到的中文字體(字體文件地址)
my_font?=?FontProperties(fname=r"c:\windows\fonts\SimHei.ttf",?size=12)
#?Data?for?plotting
t?=?np.arange(-1.0,?1.0,?0.01)
s?=?1?+?np.sin(2?*?np.pi?*?t)
plt.plot(t,?s)
#?設(shè)置?x軸名稱字體
plt.xlabel('時間?(s)',?fontproperties=my_font)
plt.ylabel('voltage?(mV)')
#?設(shè)置?標題字體
plt.title('簡單的標題',?fontproperties=my_font)
plt.show()
FontProperties對象
直接設(shè)置fontproperties參數(shù),這種情況下 也不需要額外 處理負號 問題
import?matplotlib.pyplot?as?pltimport?numpy?as?np
#?Data?for?plotting
t?=?np.arange(-1.0,?1.0,?0.01)
s?=?1?+?np.sin(2?*?np.pi?*?t)
plt.plot(t,?s)
#?設(shè)置?x軸名稱字體?黑體?SimHei
plt.xlabel('時間?(s)',?fontproperties='SimHei')
plt.ylabel('voltage?(mV)')
#?設(shè)置?標題字體?微軟雅黑?Microsoft?YaHei
plt.title('簡單的標題',?fontproperties='Microsoft?YaHei')
plt.show()
fontproperties參數(shù)
2.3.修改本機字符默認配置字體
除了以上的在代碼中進行字體設(shè)置外,我們還可以直接修改本機字符默認配置字體,不過這種情況下代碼只在本機適用咯。
In?[1]:?#?查看配置地址???...:?import?matplotlib
???...:?print(matplotlib.matplotlib_fname())
C:\Users\Gdc\anaconda3\lib\site-packages\matplotlib\mpl-data\matplotlibrc
在以下地方#font.sans-serif新增支持中文字符的字體如:SimSun(宋體),也可以直接修改#font.family: ?SimSun
!! #font.family: ?sans-serif #font.sans-serif: SimSun,
考慮到 中文字體下 負號的顯示問題,同步需要修改#axes.unicode_minus: False
修改True為False2.4.自動區(qū)別系統(tǒng)然后選擇字體【方便】
核心是以下代碼:
(引用platform模塊獲取當前系統(tǒng) mac or windows ,然后自動選擇相應(yīng)中文字體)
# 根據(jù)不同的操作系統(tǒng)設(shè)置對應(yīng)的中文字體(蘋果系統(tǒng)和Windows系統(tǒng))system_font = {"Darwin": "Arial Unicode MS", "Windows": "SimHei"}plt.rcParams['font.family'] = [system_font.get(platform.system())]import?matplotlib.pyplot?as?pltimport?numpy?as?np
import?platform
#?根據(jù)不同的操作系統(tǒng)設(shè)置對應(yīng)的中文字體(蘋果系統(tǒng)和Windows系統(tǒng))
system_font?=?{"Darwin":?"Arial?Unicode?MS",?"Windows":?"SimHei"}
plt.rcParams['font.family']?=?[system_font.get(platform.system())]
#?解決中文字體下坐標軸負數(shù)的負號顯示問題
plt.rcParams['axes.unicode_minus']?=?False?
#?Data?for?plotting
t?=?np.arange(-1.0,?1.0,?0.01)
s?=?1?+?np.sin(2?*?np.pi?*?t)
fig,?ax?=?plt.subplots()
ax.plot(t,?s)
ax.set(xlabel='時間?(s)',?ylabel='voltage?(mV)',
???????title='簡單的標題')
plt.show()
中文字符顯示
3.其他
這里我們簡單介紹獲取操作系統(tǒng)相關(guān)信息的模塊platform和常見的中文字體的字體文件名信息,方便大家理解!
3.1.platform模塊
platform模塊給我們提供了很多方法去獲取操作系統(tǒng)的相關(guān)信息。
!! 參考文檔:https://docs.python.org/3/library/platform.html
In?[1]:?import?platformIn?[2]:?platform.system()
Out[2]:?'Windows'
In?[3]:?platform.platform()
Out[3]:?'Windows-10-10.0.18362-SP0'
In?[4]:?platform.version()
Out[4]:?'10.0.18362'
In?[5]:?platform.architecture()
Out[5]:?('64bit',?'WindowsPE')
In?[6]:?platform.machine()
Out[6]:?'AMD64'
In?[7]:?platform.node()
Out[7]:?'Gdc-PC'
In?[8]:?platform.processor()
Out[8]:?'Intel64?Family?6?Model?94?Stepping?3,?GenuineIntel'
In?[9]:?platform.uname()
Out[9]:?uname_result(system='Windows',?node='Gdc-PC',?release='10',?version='10.0.18362',?machine='AMD64',?processor='Intel64?Family?6?Model?94?Stepping?3,?GenuineIntel')
3.2.常見中文字體文件名
| 宋體 | SimSun |
| 黑體 | SimHei |
| 微軟雅黑 | Microsoft YaHei |
| 微軟正黑體 | Microsoft JhengHei |
| 新宋體 | NSimSun |
| 新細明體 | PMingLiU |
| 細明體 | MingLiU |
| 標楷體 | DFKai-SB |
| 仿宋 | FangSong |
| 楷體 | KaiTi |
| 隸書 | LiSu |
| 幼圓 | YouYuan |
| 華文細黑 | STXihei |
| 華文楷體 | STKaiti |
| 華文宋體 | STSong |
| 華文中宋 | STZhongsong |
| 華文仿宋 | STFangsong |
| 方正舒體 | FZShuTi |
| 方正姚體 | FZYaoti |
| 華文彩云 | STCaiyun |
| 華文琥珀 | STHupo |
| 華文隸書 | STLiti |
| 華文行楷 | STXingkai |
| 華文新魏 | STXinwei |
往期推薦
Pandas處理字典和json數(shù)據(jù)的幾個方法
王者榮耀五周年,帶你入門Python爬蟲基礎(chǔ)操作(102個英雄+326款皮膚).
?默默關(guān)注才哥
然后驚艷所有人
可以叫我才哥
? ? ??? ? ? ? ? ?我就知道你在看!總結(jié)
以上是生活随笔為你收集整理的matplotlib 中文_详解Matplotlib中文字符显示问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中的matplotlib.p
- 下一篇: python中如何打印两行代码间的空行_