在使用 Python 的 matplotlib 画图时如果设置了标题或者坐标轴名称为中文时,显示图片上中文出现乱码或四边形,不能正常显示我们需要的中文字,体验非常不好。下面给出一个解决方法。本篇以 Linux (Debian)系统为例。
下载中文字体 可以在 wfonts  下载,也可以在其他任何能够下载到 SimHei.ttf 的地方下载。
把字体文件放在合适的位置 把字体放在 matplotlib 能够发现的位置,如何指导正确的位置
1 2 3 4 5 6 7 8 9 ➜  ~ ipython Python 3.8 .5  (default, Sep  4  2020 , 07:30 :14 )  Type  'copyright' , 'credits'  or  'license'  for  more informationIPython 7.23 .0  -- An enhanced Interactive Python. Type  '?'  for  help . In [1 ]: import  matplotlib In [2 ]: matplotlib.matplotlib_fname() Out[2 ]: '/usr/local/miniconda/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc'  
从上面可以发现一个目录:'/usr/local/miniconda/lib/python3.8/site-packages/matplotlib/mpl-data/',在该目录下有个文件夹
1 2 3 4 ➜  ~ ls  /usr/local/miniconda/lib/python3.8/site-packages/matplotlib/mpl-data fonts  images  matplotlibrc  plot_directive  sample_data  stylelib ➜  ~ ls  /usr/local/miniconda/lib/python3.8/site-packages/matplotlib/mpl-data/fonts afm  pdfcorefonts  ttf 
把下载的 SimHei.ttf 拷贝到 ttf 文件夹下
清除旧缓存 一般需要先清除掉旧的 matplotlib 缓存后才能正常使用,缓存一般在家目录下,可以通过如下方法获得缓存地址
1 2 3 4 5 6 7 8 9 ➜  ~ ipython  Python 3.8 .5  (default, Sep  4  2020 , 07:30 :14 )  Type  'copyright' , 'credits'  or  'license'  for  more informationIPython 7.23 .0  -- An enhanced Interactive Python. Type  '?'  for  help . In [1 ]: import  matplotlib In [2 ]: matplotlib.get_cachedir() Out[2 ]: '/home/jinzhongxu/.cache/matplotlib'  
发现我的确实在家目录下,因此直接去家目录删除即可
1 2 3 4 5 ➜  ~ ls  .cache             jedi  matplotlib  yarn ➜  ~ ls  .cache/matplotlib  fontlist-v330.json ➜  ~ rm  -r ~/.cache/matplotlib 
画图时使用中文 配置好中文字体后,只需要在每次画图时指定字体就可以正常显示中文字符了。
1 2 3 4 5 6 7 8 9 10 11 import  matplotlib.pyplot as  pltimport  numpy as  npplt.rcParams["font.sans-serif" ] = ["SimHei" ]   plt.rcParams["axes.unicode_minus" ] = False    x = np.linspace(-5 , 5 , 101 ) y = np.cos(x) plt.plot(x, y, "r" ) plt.title(u"余弦" ) plt.show() 
一劳永逸 从上面可知,每次画图都需要在代码中配置中文字体才能正常显示中文字符,下面通过设置可以直接使用中文字体,那就是修改上面的配置文件
1 2 3 4 5 6 7 8 vim /usr/local/miniconda/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc font.family         : sans-serif font.sans-serif     : SimHei, Bitstream Vera Sans, ... axes.unicode_minus  : False 
扩展-画图时隐藏图框 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import  matplotlib.pyplot as  pltimport  numpy as  npa = 3  x = np.linspace(-(a + 1 ) * np.pi / 4 , (a + 1 ) * np.pi / 4 , 301 ) y1 = a * (1  + np.cos(x)) * np.cos(x) y2 = a * (1  + np.cos(x)) * np.sin(x) fig, ax = plt.subplots() for  key, spine in  ax.spines.items():              spine.set_visible(False ) plt.plot(y2, -y1) plt.xticks([]) plt.yticks([]) plt.axis("equal" ) plt.show() 
扩展-调整图片文字大小等 整体调整 1 2 3 4 5 import  matplotlibfont = {"family" : "SimHei" , "weight" : "bold" , "size" : 20 } matplotlib.rc("font" , **font) 
1 2 3 import  matplotlibmatplotlib.rcParams.update({'font.size' : 20 }) 
1 2 3 import  matplotlib.pyplot as  pltplt.rcParams.update({'font.size' : 20 }) 
单个调整 1 2 3 4 5 import  matplotlibSIZE = 20  matplotlib.rc('font' , size=SIZE) matplotlib.rc('axes' , titlesize=SIZE) 
1 2 3 4 5 6 7 8 9 10 11 import  matplotlib.pyplot as  pltSIZE = 20  plt.rc('font' , size=SIZE)           plt.rc('axes' , titlesize=SIZE)      plt.rc('axes' , labelsize=SIZE)     plt.rc('xtick' , labelsize=SIZE)     plt.rc('ytick' , labelsize=SIZE)     plt.rc('legend' , fontsize=SIZE)     plt.rc('figure' , titlesize=SIZE)   
参考链接 
matplotlib对中文的支持(Font family [‘sans-serif’] not found.Falling back to DejaVu Sans) ubuntu系统下matplotlib中文乱码问题 如何在 Matplotlib 中设置刻度标签 xticks 字体大小