在使用 matplotlib 绘图时,中文设置(如 titile、x label、y label 等)经常出现无法正常展示的问题。我们先来看一个代码示例,其中 title、x label、y label 均设置为中文。
# step0:导入画图工具包 matplotlib
import matplotlib.pyplot as plt
# step1:手动创建一个figure对象,相当于一个空白的画布
figure = plt.figure()
# step2:字体基本设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# step3:在画布上添加一个坐标系,标定绘图位置
axes1 = figure.add_subplot(1, 1, 1)
# step4:准备画图的数据
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [21, 27, 29, 32, 29, 28, 35, 39, 49]
# step5:设置基本信息
axes1.set_xlabel('X轴')
axes1.set_ylabel('Y轴')
axes1.set_title("图片标题")
# step6:画图,设置线条颜色、线型、点标记符
axes1.plot(x, y, color='red', linestyle='-.', marker='*')
# step7:展示
plt.show()
上面下代码示例执行结果如下图所示,中文设置展示为“口”,与此同时,程序执行过程中也会报错,信息如下。
报错信息:
findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans.
sans-serif 是无衬线字体,是一种通用字体族,常见的中文无衬线字体有:宋体(STSong), 黑体(SimHei), 楷体(Kaiti),隶书(Lisu), 仿宋(FangSong), 幼圆(YouYuan),微软雅黑(Microsoft YaHei)等。之所以出现上面的报错,根本原因在于运行程序的机器上没有对应的字体配置。原因清楚了,问题也就好解决了——下载对应的字体文件,放置于指定的文件目录下并进行配置即可。
步骤-1: 下载需要的字体文件
本文以黑体(SimHei)为例,下载对应的字体文件 “SimHei.ttf”,下载地址
步骤-2: 将下载的字体文件放到指定目录下
import matplotlib
print(matplotlib.matplotlib_fname())
上述代码执行结果:
/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc
步骤-3: 删除 matplotlib 的缓冲目录
import matplotlib
print(matplotlib.get_cachedir())
对于 Linux、Mac OX 类型操作系统,可以直接使用命令“rm -rf 路径” 删除缓存,对于 Windows 系统可以手动删除。本文所示的例子中,删除命令为:
rm -rf /Users/guojin/.matplotlib
步骤-4: 修改文件 matplotlibrc,增加配置
这一步非常关键,很多时候配置不生效,都是由于此步骤缺失。修改 matplotlibrc 文件
修改/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc,修改内容有三处,如下所示:
# 1.去掉前面的 # 号,这是一个注解符
font.family : sans-serif
# 2.去掉前面的 # 号,并在冒号后面添加 SimHei
font.sans-serif : SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
# 3.去掉前面的 # 号,并将True改为False
axes.unicode_minus : False
步骤-5: 重启集成开发环境-IDE
经过上述步骤,基本大功告成,重启集成开发环境-IDE(Eclipse、IntelliJ IDEA等),重新运行程序即可正常显示。注意:重启大多数时候都是必要的!!!
在上一节的例子中已经介绍了字体的设置方法,这里重新回顾一下。
# 字体基本设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
除了 SimHei 之外,常用的中文字体还有很多,设置方式如下:
plt.rcParams['font.sans-serif']=['STSong'] ## 中文宋体
plt.rcParams['font.sans-serif']=['SimHei'] ## 中文黑体
plt.rcParams['font.sans-serif']=['Kaiti'] ## 中文楷体
plt.rcParams['font.sans-serif']=['Lisu'] ## 中文隶书
plt.rcParams['font.sans-serif']=['FangSong'] ## 中文仿宋
plt.rcParams['font.sans-serif']=['YouYuan'] ## 中文幼圆
通过执行如下代码,获取字体文件路径信息。
import matplotlib
print(matplotlib.matplotlib_fname())
通过上述代码,获得字体文件路径为:
/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc
文件 matplotlibrc 中有一段默认的配置,如下所示:
#font.style : normal
#font.variant : normal
#font.weight : normal
#font.stretch : normal
#font.size : 10.0
在实际应用中,我们可以通过修改上述配置,或者在代码中直接设置实现字体格式控制。其中,字体的 style 和 weight 有如下选项:
# 字体粗细、类型
styles=['normal','italic','oblique']
weights=['light','normal','medium','semibold','bold','heavy','black']