在用matplotlib進行繪圖時,如果在繪製過程中會用到中文,則默認情況下會出現字體警告,中文字符顯示為方框或亂碼的形式,我們這裡將介紹多種解決方案。
02
目錄:
1.中文字體顯示問題
2.幾種解決方案
2.1.在繪圖代碼中設置全局字體
2.2.在繪圖代碼中設置局部字體
2.3.修改本機字符默認配置字體
2.4.自動區別系統然後選擇字體
3.其他
3.1.platform模塊
3.2.常見中文字體文件名
1.中文字體顯示問題
在用matplotlib進行繪圖時,如果在繪製過程中會用到中文,則默認情況下會出現字體警告,中文字符顯示為方框或亂碼的形式,具體見下方案例: span>
import matplotlib.pyplot as plt
import< /span> numpy as np
# Data for plotting
t = np.arange(-1.0, < span >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:UsersGdcanaconda3libsite-packagesmatplotlibackendsackend_agg.py:238: RuntimeWarning : Glyph 31616 missing from current font.
font.set_text(s, 0.0, flags=flags)
...
我們可以看到在警告信息中提示“missing from current font”,直譯就是“在當前字體中缺少(中文字符)”,大概含義就是默認的字體中不含中文字符。
對於這類問題,核心就是設置繪製圖片時的字體參數包含全部的需要用到的字符。
2.幾種解決方案
我們在解決中文字符顯示問題時,有兩類方案多種方式:方案1,在繪圖代碼中設置全局字符顯示字體;方案2,在繪圖代碼中設置局部字體;方案3,修改本機字符默認配置的字體。
2.1.在繪圖代碼中設置全局字體
rcParams修改font.sans-serif 或font.family 對應字體
# 以下代碼從全局設置字體為SimHei(黑體),解決顯示中文問題【Windows】< br># 設置font.sans-serif 或 font.family 均可
plt.rcParams['font.sans-serif'] = [' SimHei']
# plt.rcParams['font.family']=['SimHei']
# 解決中文字體下坐標軸負數的負號顯示問題
plt.rcParams['axes.unicode_minus'] = False
由於mac電腦默認沒有SimHei(黑體)字體,大家可以下載安裝該字體或者修改為系統自帶的字體如Arial Unicode MS,如下:
# 以下代碼從全局設置字體為Arial Unicode MS,解決顯示中文問題【mac】
# 設置font.sans-serif 或 font.family 均可
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
# plt.rcParams['font.family']=['Arial Unicode MS']
# 解決中文字體下坐標軸負數的負號顯示問題
plt.rcParams['axes.unicode_minus'] = False
rc方法,其實和設置rcParams 基本等效
# 設置font字典為 SimSun(宋體),大小為12(默認為10)
font = {'family' : 'SimSun',
'size' : '12'}
# 設置 字體
plt.rc('font', **font)
# 解決中文字體下坐標軸負數的負號顯示問題
plt.rc('axes', unicode_minus=False)
!! 比如:
rc('lines', linewidth=2, color=' r')
等效於以下:rcParams['lines.linewidth'] = 2
rcParams['lines.color'] = < span >'r'
2.2.在繪圖代碼中設置局部字體 span>
FontProperties對象,這種情況下不需要額外處理負號問題
import matplotlib.pyplot as plt
import< /span> numpy as np
# 引入matplotlib字體管理 FontProperties
from matplotlib.font_manager import FontProperties
# 設置我們需要用到的中文字體(字體文件地址)
my_font = FontProperties(fname=r'c:windowsfontsSimHei.ttf'< /span>, size=12)
# Data for plotting
t = np.arange(-1.0, 1.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)< br>
plt.plot(t, s)
# 設置 x軸名稱字體
plt.xlabel('時間 (s)' span>, fontproperties=my_font)
plt.ylabel('voltage (mV)')
# 設置 標題字體
plt.title(< span >'簡單的標題', fontproperties=my_font)
plt.show()
直接設置fontproperties參數,這種情況下也不需要額外處理負號問題
import matplotlib.pyplot as plt
import< /span> numpy as np
# Data for plotting
t = np.arange(-1.0, < span >1.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
plt.plot(t, s)
# 設置 x軸名稱字體 黑體 SimHei
plt.xlabel('時間 (s) ', fontproperties='SimHei')
plt.ylabel('voltage (mV)')
# 設置 標題字體微軟雅黑 Microsoft YaHei
plt.title('簡單的標題', fontproperties='Microsoft YaHei')
plt .show()
2.3.修改本機字符默認配置字體
除了以上的在代碼中進行字體設置外,我們還可以直接修改本機字符默認配置字體,不過這種情況下代碼只在本機適用咯。
In [1]: # 查看配置地址
.. .: import matplotlib
...: print(matplotlib.matplotlib_fname())
C:UsersGdcanaconda3libsite-packagesmatplotlibmpl-datamatplotlibrc
在以下地方#font.sans-serif新增支持中文字符的字體如:SimSun(宋體),也可以直接修改#font.family: SimSun
!! #font.family: sans-serif#font.sans-serif: SimSun,
考慮到 中文字體下 負號的顯示問題,同步需要修改#axes.unicode_minus: False
2.4.自動區別系統然後選擇字體【方便】
核心是以下代碼:
(引用platform模塊獲取當前系統 mac or windows ,然後自動選擇相應中文字體)
system_font = {'Darwin': 'Arial Unicode MS', 'Windows': 'SimHei' }
plt.rcParams['font.family'] = [system_font. get(platform.system())]
import matplotlib.pyplot as plt
import numpy as np
import platform
# 根據不同的操作系統設置對應的中文字體(蘋果系統和Windows系統)
system_font = {'Darwin': 'Arial Unicode MS', 'Windows': 'SimHei'}
plt.rcParams['font.family'] = [system_font.get(platform.system())]
# 解決中文字體下坐標軸負數的負號顯示問題< /span>
plt.rcParams['axes.unicode_minus'] = False
# Data for plotting< br>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.其他
這裡我們簡單介紹獲取操作系統相關信息的模塊platform和常見的中文字體的字體文件名信息,方便大家理解!
3.1.platform模塊
platform模塊給我們提供了很多方法去獲取操作系統的相關信息。
!! 參考文檔:https://docs.python.org/3/library/platform.html
In [1]: import platform
In [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 span>]: uname_result(system='Windows', node='Gdc-PC', release='10', version=< span >'10.0.18362', machine='AMD64', processor='Intel64 Family 6 Model 94 Stepping 3, GenuineIntel')
< /code>
3.2.常見中文字體文件名
往期推薦
- < li >
王者榮耀五週年,帶你入門Python爬蟲基礎操作(102個英雄+326款皮膚).
Pandas處理字典和json數據的幾個方法
< span > 默默關注才哥
然後驚艷所有人
可以叫我才哥
文章為用戶上傳,僅供非商業瀏覽。發布者:Lomu,轉轉請註明出處: https://www.daogebangong.com/zh-Hant/articles/detail/Detailed%20explanation%20of%20Matplotlib%20Chinese%20character%20display%20problem.html
评论列表(196条)
测试