永久解决 matplotlib 图例中文方块错误

问题

当打印图例的时候,图可以正常显示,但中文会显示方块。比如title。然后会有个小报错:
报错描述:

/Users/username/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py: 1331: UserWarning: findfont: Font family [‘SimHei’] not found. Falling back to DejaVu Sans
(prop.get_family(), self.defaultFamily[fontext]))

查看当前环境的字体路径

import matplotlib
print(matplotlib.matplotlib_fname())

于是我就去看了下 /Users/username/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py 这个文件,我是 Mac,Windows 的 matplotlib 路径根据错误提示也能找到。

解决方法

首先下载一个字体文件 SimHei.ttf
解压字体后拷贝到 matplotlib/mpl-data/fonts目录下面。

$ mv ~/Downloads/SimHei.ttf ~/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/

修改配置文件 matplotlibrc

$ subl ~/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc

subl 是我之前配置的 sublime 的快捷命令。

found 这三项配置并修改:

font.family: sans-serif

font.sans-serif: SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

axes.unicode_minus: False # 解决负号'-'显示为方块的问题

前两项大概在 194 行,第三项大概在 325 行。

但是改了配置之后并不会生效,需要重新加载字体,在 Python 中运行如下代码即可:

from matplotlib.font_manager import _rebuild
_rebuild() # reload一下

现在再打印图例一点问题都没有了,支持中英文混搭。

再次碰到问题,这次试一下删除字体缓存路径,重启编辑器。

字体缓存路径

import matplotlib
print(matplotlib.get_cachedir())

删除缓存

$ rm -rf ~/.matplotlib
本作品采用《CC 协议》,转载必须注明作者和本文链接
不要试图用百米冲刺的方法完成马拉松比赛。
本帖由 Galois 于 3年前 加精
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!