问题描述
在使用 matplotlib 绘图的时候,运行中警告 “RuntimeWarning: Glyph 39064 missing from current font. font.set_text(s, 0, flags=flags)” , 结果为中文无法显示。
问题分析
该原因是因为对应字体无法显示中文的问题,需要加载对应正确的字体包。
解决问题
网上一般建议使用
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False
而上述的临时生效,若每次输入都要执行一次未免也太过繁琐了,何况 SimHei (黑体)字体在部分 linux 系统是不存在的,上述操作可能存在不生效的情况。
而我更想彻底解决该问题, 希望可以永久生效,于是相关思路如下
- 获取 matplotlib 配置,用于检查是否存在可以显示中文的字体
- 若无,获取 matplotlib 存在字体文件地方并下载相关字体文件。
- 若有,修改对应配置
- 获取 matplotlib 缓存地方,删除缓存使之配置生效
- 运行测试
获取 matplotlib 配置
- windows && linux 均适用
import matplotlib as mat
# Get the location of the config file.
print(matplotlib.matplotlib_fname())
# 返回结果
# /home/wangkai/.local/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc
-
以 font.sans-serif、 font.family 关键字进行搜索, linux 系统可以使用 / font.family 回车 点击 n,如下图所示,一般情况下这里是注释掉的,需要把注释去掉,另外 key 在配置文件只能唯一,即便注释了也不行。
-
搜索发现字体缺失(也有可能不认识那些字体,😃)
因此需要下载对应字体库, 字体下载地址
获取字体库存放路径,因为上述获取包的存放地址后,基本路径都一样,去除配置 matplotlibrc, 追加 /mpl-data/fonts/ttf/ 即是字体文件存放的地方,可以把对应下载的 ttf 文件存放在该目录。 -
修改 matplotlibrc 配置,将 font.family 行改为 font.family = sihei,font.sans-serif追加 simhei, 特别说明对大小写敏感,因为我下载的字体库是 simhei,所以我使用是小写,如下图所示
-
保存
删除缓存
- 获取缓存地址
import matplotlib as mat
# Return the string path of the cache directory.
print(mat.get_cachedir())
# 返回结果
# /home/wangkai/.cache/matplotlib
- 删除缓存, rm -rf /home/wangkai/.cache/matplotlib/
运行测试
Tips
解决负号无法正常显示的问题
上述 获取 matplotlib 配置 操作完成后, 进入配置文件搜索 unicode_minus 关键字,将该值改为 False 即可, 如下图所示
效果图: