使用 Matplotlib 或者 Seaborn 画图时,如果图像上需要显示中文,经常会发现出来的是一堆乱码(一般是方框),并且报以下的警告:

  1. RuntimeWarning: Glyph 33891 missing from current font.

本篇文章对此问题的解决方法做一个整理。

1. 安装系统依赖

如果系统并没有 fc-list 命令,则先需要安装下面的软件:

  1. $ sudo yum install -y fontconfig mkfontscale ttmkfdir

安装完之后,查看下系统上支持的中文字体有哪些:

  1. $ fc-list :lang=zh

目前我的服务器是没有安装任何中文字体的。

2. 安装中文字体

这里我们会安装两个中文字体,分别是 SimHei(黑体) 和 Microsoft YaHei(微软雅黑),这两个字体可以在 Windows 系统的电脑上 C:\Windows\Fonts 中找到,当然你也可以这里进行下载 SimHei 字体。
image.png

将这两个字体上传到服务器 /usr/share/fonts/chinese 文件夹下(如果没有就创建一个文件夹),并改变相关权限:

  1. $ sudo chmod -R 755 /usr/share/fonts/chinese
  2. $ sudo ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir

修改 /etc/fonts/fiont.conf

  1. <!-- Font directory list -->
  2. <dir>/usr/share/fonts</dir>
  3. <dir>/usr/share/X11/fonts/Type1</dir>
  4. <dir>/usr/share/X11/fonts/TTF</dir>
  5. <dir>/usr/local/share/fonts</dir>
  6. <dir prefix="xdg">fonts</dir>
  7. <dir>/usr/share/fonts/chinese</dir> <!--⭐-->
  8. <!-- the following element will be removed in the future -->
  9. <dir>~/.fonts</dir>

刷线一下缓存,并再次查看中文字体:

  1. $ fc-cache
  2. $ fc-list :lang=zh
  3. /usr/share/fonts/chinese/MSYH.TTC: Microsoft YaHei:style=Normal
  4. /usr/share/fonts/chinese/SIMSUN.TTC: SimSun,宋体:style=Regular,常规
  5. /usr/share/fonts/chinese/MSYHBD.TTC: Microsoft YaHei:style=Έντονα
  6. /usr/share/fonts/chinese/MSYH.TTC: Microsoft YaHei UI:style=Normal
  7. /usr/share/fonts/chinese/MSYHBD.TTC: Microsoft YaHei UI:style=Έντονα
  8. /usr/share/fonts/chinese/SIMSUN.TTC: NSimSun,新宋体:style=Regular,常规
  9. /usr/share/fonts/chinese/MSYHL.TTC: Microsoft YaHei UI,Microsoft YaHei UI Light:style=Light,Regular
  10. /usr/share/fonts/chinese/SimHei.ttf: SimHei:style=Regular
  11. /usr/share/fonts/chinese/MSYHL.TTC: Microsoft YaHei,Microsoft YaHei Light:style=Light,Regular

3. Matplotlib配置

修改你 Python 环境下 site-packages/matplotlib/mpl-data/matplotlibrc 分别删除 249 行、257 行和 400 行前面的#号取消注释:

  1. font.family : sans-serif
  2. font.sans-serif : SimHei, Microsoft YaHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif,WenQuanYi Zen Hei Mono
  3. axes.unicode_minus : False

注意font.sans-serif 前面需要添加 SimHei, Microsoft YaHei

删除 matplotlib 缓冲目录,并重新加载字体:

  1. $ rm -rf ~/.cache/matplotlib
  2. $ python
  3. >>> from matplotlib.font_manager import _rebuild
  4. >>> _rebuild()

再次运行代码,中文就可以正常显示了。

4. Seaborn配置

☂️中文显示乱码

5. 参考文档