在用matplotlib进行绘图时,如果在绘制过程中会用到中文,则默认情况下会出现字体警告,中文字符显示为方框或乱码的形式,我们这里将介绍多种解决方案。
02
目录:
1.中文字体显示问题
2.几种解决方案
2.1.在绘图代码中设置全局字体
2.2.在绘图代码中设置局部字体
2.3.修改本机字符默认配置字体
2.4.自动区别系统然后选择字体
3.其他
3.1.platform模块
3.2.常见中文字体文件名
1.中文字体显示问题
在用matplotlib进行绘图时,如果在绘制过程中会用到中文,则默认情况下会出现字体警告,中文字符显示为方框或乱码的形式,具体见下方案例:
import matplotlib.pyplot as plt
import 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”,直译就是“在当前字体中缺少(中文字符)”,大概含义就是默认的字体中不含中文字符。
对于这类问题,核心就是设置绘制图片时的字体参数包含全部的需要用到的字符。
2.几种解决方案
我们在解决中文字符显示问题时,有两类方案多种方式:方案1,在绘图代码中设置全局字符显示字体;方案2,在绘图代码中设置局部字体;方案3,修改本机字符默认配置的字体。
2.1.在绘图代码中设置全局字体
rcParams修改 font.sans-serif 或 font.family 对应字体
# 以下代码从全局设置字体为SimHei(黑体),解决显示中文问题【Windows】
# 设置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'] = 'r'
2.2.在绘图代码中设置局部字体
FontProperties对象,这种情况下 不需要额外 处理负号 问题
import matplotlib.pyplot as plt
import numpy as np
# 引入matplotlib字体管理 FontProperties
from matplotlib.font_manager import FontProperties
# 设置我们需要用到的中文字体(字体文件地址)
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)
# 设置 x轴名称字体
plt.xlabel('时间 (s)', fontproperties=my_font)
plt.ylabel('voltage (mV)')
# 设置 标题字体
plt.title('简单的标题', fontproperties=my_font)
plt.show()
直接设置fontproperties参数,这种情况下 也不需要额外 处理负号 问题
import matplotlib.pyplot as plt
import 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)
# 设置 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:\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
2.4.自动区别系统然后选择字体【方便】
核心是以下代码:
(引用platform模块获取当前系统 mac or windows ,然后自动选择相应中文字体)
# 根据不同的操作系统设置对应的中文字体(苹果系统和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())]
# 解决中文字体下坐标轴负数的负号显示问题
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.其他
这里我们简单介绍获取操作系统相关信息的模块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]: 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数据的几个方法
王者荣耀五周年,带你入门Python爬虫基础操作(102个英雄+326款皮肤).
默默关注才哥
然后惊艳所有人
可以叫我才哥
我就知道你在看!