解决使用 matplotlib 画图时中文显示乱码问题

问题

解决使用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

你可能感兴趣的:(部署,python,开发语言,后端,matplotlib,可视化)