解决使用matplotlib绘图无法显示中文问题。在使用 matplotlib 画图时如果设置了中文标题或者坐标轴时,显示图片上中文出现乱码,不能正常显示我们需要的中文,报错信息如下:
Glyph 31859 missing from current font. font.set_text(s, 0, flags=flags)
在搜集了网上大量教程之后,大部分给出的解决方法如下:
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 用来显示中文
plt.rcParams["axes.unicode_minus"] = False # 用来显示负号
但实际测试后仍无法解决问题,在仔细分析之后,发现是Linux服务器中缺失字体导致。
以SimHei字体为例,下载SimHei字体。
(tp) [cyl@localhost ]$ ipython
Python 3.7.9 (default, Aug 31 2020, 12:42:55)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.27.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import matplotlib
In [2]: matplotlib.matplotlib_fname()
Out[2]: '/home/anaconda3/envs/tp/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc'
cd到列出路径的父目录,并进入到fonts/ttf子文件夹中,放进去下载的字体ttf文件
In [14]: cd /home/anaconda3/envs/tp/lib/python3.7/site-packages/matplotlib/mpl-data/
/home/anaconda3/envs/tp/lib/python3.7/site-packages/matplotlib/mpl-data
In [15]: ll
总用量 52
drwxr-xr-x. 5 cyl 45 9月 8 2020 fonts/
drwxr-xr-x. 2 cyl 4096 9月 8 2020 images/
-rw-r--r--. 1 cyl 39901 9月 8 2020 matplotlibrc
drwxr-xr-x. 3 cyl 4096 9月 8 2020 sample_data/
drwxr-xr-x. 2 cyl 4096 9月 8 2020 stylelib/
In [16]: cd fonts
/home/anaconda3/envs/tp/lib/python3.7/site-packages/matplotlib/mpl-data/fonts
In [17]: ll
总用量 12
drwxr-xr-x. 2 cyl 4096 9月 8 2020 afm/
drwxr-xr-x. 2 cyl 4096 9月 8 2020 pdfcorefonts/
drwxr-xr-x. 2 cyl 4096 2月 26 16:12 ttf/
In [18]: cd ttf
/home/anaconda3/envs/tp/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf
清除掉旧的 matplotlib 缓存后才能正常使用
首先获取缓存位置
(tp) [cyl@localhost Trajectory-Transformer]$ ipython
Python 3.7.9 (default, Aug 31 2020, 12:42:55)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.27.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import matplotlib
In [2]: matplotlib.get_cachedir()
Out[2]: '/home/cyl/.cache/matplotlib'
删除缓存文件夹
rm -rf /home/cyl/.cache/matplotlib/*
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"] = ["SimHei"] # 用来显示中文
plt.rcParams["axes.unicode_minus"] = False # 用来显示负号
x = np.linspace(-10, 10, 100)
y = np.sin(x)
plt.plot(x, y, "r")
plt.title(u"正弦")
plt.show()
直接修改上面得到的配置文件,将SimHei 改成默认字体,不然每次调用时都要声明一次
vim /home/anaconda3/envs/tp/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc
# 把前面的注释去掉
font.family : sans-serif
# 去掉注释,并添加字体名 SimHei 在第一个位置
font.sans-serif : SimHei, Bitstream Vera Sans, ...
# 去掉注释,并修改 True 为 False,用来显示负号
axes.unicode_minus : False