1.Ubuntu19.10
2.conda4.8.3
3.python3.7.6
4.matplotlib 3.1.3
近期正在学习使用matplotlib库,碰到设置字体的问题,刚好记下来,备用。
根据网上的各种说法,先把Microsoft YaHei Mono字体粘贴到 当前python的路径/site-packages/matplotlib/mpl-data/fonts/ttf(python的路径,可以通过查看pip -V),习惯性的改名为YaHeiMono.ttf(强迫症,字体名称格式要一致),直接在添加以下代码
plt.rcParams['font.sans-serif']=['YaHeiMono']
结果一直报错找不到jetbrain,百度得到可能有用的结果就是找到:当前python路径/site-packages/matplotlib/mpl-data/matplotlibrc,添加
font.family: sans-serif
font.sans-serif: YaHeiMono
保存之后,输入代码:
import matplotlib
print(matplotlib.get_cachedir()) #/home/deathgod/.cache/matplotlib
找到cache路径后,删除cache目录下的所有文件,点击jupyter notebook下的工具栏Kernel–>restart选项重启,再点击Cell–>All Output -->clear清除之前的运行结果,结果再次报错。
接着百度,然后想到之前清除cache目录是不是有什么关键信息。
vi /home/deathgod/.cache/matplotlib/fontlist-v330.json
主要是两个list:afmlist,ttflist,我查看了ttflist,其中有这么一段信息:
{
"fname": "fonts/ttf/YaHeiMono.ttf",
"name": "Microsoft YaHei Mono",
"style": "normal",
"variant": "normal",
"weight": 400,
"stretch": "normal",
"size": "scalable",
"__class__": "FontEntry"
},
我一看到这个name,觉得是不是我使用的name出错了,改成这样:
plt.rcParams['font.sans-serif']=['Microsoft YaHei Mono']
结果竟然真的没报错,无语。。。。。。原来调用的不是我改过的字体文件名,而是蕴含在字体信息里的字体名称。然后我又仔细看了以下ttflist下的fname,发现字体搜索路劲其实有两个:fonts/ttf,/usr/share/fonts/truetype,以后把想要使用的字体都放在这两个目录下就行了,然后再调用plt.rcParams接口,也不用更改什么matplotlibrc。
Tips: 注意serif,sans-serif,monospace三种字体类型的区别,举个例子:
plt.rcParams['font.serif']=['Microsoft YaHei Mono']
也会报错,找不到雅黑字体,这是因为雅黑是非衬线字体(sans-serif),另外说一句simhei也是非衬线字体(sans-serif)