这个问题很坑,看了几十个帖子,都没解决掉,最终自己猜了出来,记录以下。
大多数帖子的思路是一致的,如下面这些
https://blog.csdn.net/mr_muli/article/details/89485619
思路步骤就是:
1. 下载simhei字体
2. 复制到matplotlib下的ttf文件夹
3. 更改matplotlibrc文件
4. 删除cache里的文件
————————————————————————————————————
首先,上面的做法应该是没用的,因为你再次运行代码后,可以取cache文件夹里去看,新生成的.json文件里,是搜索不到simhei这个字体的,说明你的操作没用。
再次执行依然报错
findfont: Font family ['simhei'] not found. Falling back to DejaVu Sans.
有的帖子说道,可以通过
from matplotlib.font_manager import _rebuild
来重新编译
我的matplotlib里没有这个rebuild函数,不知道是不是版本问题
至此,基本可以定位问题
就是你修改matplotlibrc文件,这个字体并没有被导入matplotlib里,所以依旧无法显示中文
——————————————————————————————————————————
解决方法:
1. 执行fc-list :lang=zh命令,可以查看系统已安装了哪些中文字体
可以看到,其实我的ubuntu系统里已经装了很多中文字体,只是matplotlib无法用而已。
比如这里,有个叫ukai.ttc的文件,推测应当是楷体
那么思路就是如何让matlib导入这个楷体
2. 查看matplotlib的当前字体库情况
from matplotlib import font_manager
for font in font_manager.fontManager.ttflist:
print(font.name,'---',font.fname)
执行上述代码,可以看到当前matplot里所有的字体库
可以看到,在matplotlib的库里,是可以识别到系统已安装的这个ukai.ttc文件
那如何导入呢?
3. 修改matplotlibrc文件
我的路径是在
~/anaconda3/envs/mm/lib/python3.7/site-packages/matplotlib/mpl-data下
修改如下:
最终修改这两处:
font.family : AR PL UKai CN
font.sans-serif: ukai
注意:font.family换成你已有的一个中文字体的family,即步骤2截图中打印的最开始处
font.sans-serif: 换成ttf文件的名字前缀,这里是ukai,最后,成功显示楷体
——————————————————————————————
总结:问题的本质很简单
就是安装字体,调用字体
我的最终解决方法,其实没有安装字体,只是调用了字体
修改matplotlibrc文件的本质,是修改了matplotlib的字体调用方式。