Python - matplotlib 不显示中文 && findfont: Font family ['simsun'] not found

发布时间 2023-05-26 16:40:55作者: 安全兔

一.发现问题

python matplotlib.plt 使用 plt.title 写标题时,标题显示为方框,无法正常显示中文,遂开始修复之旅。

二.尝试解决

查询网上大神给出的解决方案是添加全局字体配置:

plt.rcParams['font.sans-serif'] = ['simsun']

如果添加后运行代码无 findfont: Font family ['simsun'] not found 报错且正常显示中文,那很奈斯,后面的就不用操作了,如果添加后显示如下报错则革命尚未成功,同志仍需努力:

findfont: Font family ['simsun'] not found. Falling back to DejaVu Sans.
/Users/xxx/miniforge3/envs/macm1tf/lib/python3.8/site-packages/matplotlib/backends/backend_agg.py:240: RuntimeWarning: Glyph 23089 missing from current font.
  font.set_text(s, 0.0, flags=flags)

上述报错代表 matplotlib 库内没有 simsun 字体,所以需要下载相关文件,simsun 就是最常见的宋体。

三.安装 simsun.ttc 并配置 matplotlib

1.下载对应字体

可以在其他Windows电脑上找到对应字体,或者自己下载对应字体

2.拷贝 simsun.ttc 到 matplotlib 的 font 文件夹

找到对应字体后在自己对应的 python 程序内执行下述语句找到 matplotlib 存放 font 的位置:

import matplotlib
print(matplotlib.matplotlib_fname())

会得到类似下述地址,以 matplotlibrc 结尾:

/Users/xxxx/miniforge3/envs/macm1tf/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc

以这个路径为基础截取至 mpl-data,然后执行下述命令拷贝 simsun.ttc 到 font 文件夹:

cd /Users/xxx/miniforge3/envs/macm1tf/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf
cp /downLoadPath/simsun.ttc .

3.修改 Matplotlib 配置

import matplotlib
print(matplotlib.matplotlib_fname())

继续通过该命令获得 matplotlib 的配置文件:

vim /Users/xxxx/miniforge3/envs/macm1tf/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc

执行下述命令找到如图所示相关位置:

/font.family

修改1 :去掉 font.family 前的 # 号 (256行附近)

#font.family:  sans-serif
↓
font.family:  sans-serif

修改2:去掉 font.sans-serif 的 # 号,并加入 simsun (260行附近)

#font.serif:      DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
↓
font.serif:      DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif, simsun 

修改3:axes.unicode_minus 修改为 False (405行附近)

#axes.unicode_minus: True # use Unicode for the minus symbol rather than hyphen.  See
                           # https://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes
↓
axes.unicode_minus: False # use Unicode for the minus symbol rather than hyphen.  See
                           # https://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes

修改后 :wq 即可,配置文件修改完毕。

4.清空原有配置

通过下述命令获取 matplotlib 缓存位置,还是在自己对应 python 项目中执行:

import matplotlib
print(matplotlib.get_cachedir())

通过该命令获取 cache 地址,一般在 /Users 下自己对应的账号下:

/Users/xxx/.matplotlib

执行 rm =r 斩断一切祸源:

rm -r /Users/xxx/.matplotlib

5.再次执行任务

大功告成,如果执行无效的话可以重启 pycharm 或者编辑器重试。同时也不需要再配置该参数: