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

时间:2025-03-13 10:21:46

问题

解决使用matplotlib绘图无法显示中文问题。在使用 matplotlib 画图时如果设置了中文标题或者坐标轴时,显示图片上中文出现乱码,不能正常显示我们需要的中文,报错信息如下:

Glyph 31859 missing from current font. font.set_text(s, 0, flags=flags)

在搜集了网上大量教程之后,大部分给出的解决方法如下:

import  as plt

["-serif"] = ["SimHei"]  # 用来显示中文
["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  as plt
import numpy as np

["-serif"] = ["SimHei"]  # 用来显示中文
["axes.unicode_minus"] = False  # 用来显示负号

x = (-10, 10, 100)
y = (x)
(x, y, "r")
(u"正弦")
()

推荐配置方法

直接修改上面得到的配置文件,将SimHei 改成默认字体,不然每次调用时都要声明一次

 vim /home/anaconda3/envs/tp/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc
# 把前面的注释去掉
         : sans-serif
# 去掉注释,并添加字体名 SimHei 在第一个位置
-serif     : SimHei, Bitstream Vera Sans, ...
# 去掉注释,并修改 True 为 False,用来显示负号
axes.unicode_minus  : False