分类 python 下的文章

使用Matplotlib画图时如何修改字体及显示汉字


前情提要

Matplotlib是python下一个非常常用的绘图库, 可是如果你用pip install matplotlib默认安装后, 却会发现它会把你输入的中文变成框框.
原因其实很简单, 只是因为默认的Matplotlib安装不带中文字体而已, 所以我们需要将添加中文字体进去.
当然还有可能的原因是你用的是python2, 对于utf-8的中文文本要进行一些别的非常恶心的操作, 当然这个不是本文的讨论范围.
以下文字的操作环境是Windows SubSystem for Linux, 但是原理在各个平台应该是通用的.

如何添加中文字体到Matplotlib中

Matplotlib的字体无论是在Linux还是在Windows中, 都和系统字体是完全独立的, 因此你需要手动将中文复制到其字体路径中去.
具体的路径位置和你当前使用python的site-packages路径有关, 在Linux中这个路径有可能在/usr/lib/python*下也有可能在~/.local/lib/python*下, 而在Windows中这个路径应该在你的python安装路径下.
那么具体的字体文件夹路径在哪里呢?假设$site-packages是你的site-packages路径, 那么字体目录在$site-packages/matplotlib/mpl-data/font下. 当然这个目录下一般会有afm pdfcorefonts ttf三个文件夹, 一般我们添加的都是ttf字体, 因此一般是添加到该目录下. 注意ttc字体放在这个目录下并不能被识别
比较推荐的代码字体有: 更纱黑体, 思源黑体.
更纱黑体是某个在微软工作的大佬正在开发而且不断在维护的一个字体, 效果很棒.
思源黑体是Adode开源的一个字体, 对于汉字和字幕都有着很好的效果.
总体来说, 这两个字体的显示效果差不多, 细节上略有差别, 具体的细节可以戳这里.

清空字体缓存

rm -rf ~/.cache/matplotlib

只有正确清空了字体缓存, 你的字体才会被Matplotlib再次识别. 对于Windows, 这个路径可能在C:\Users\$username\.matplotlib下.

查看已经添加在Matplotlib中的字体名

from matplotlib.font_manager import FontManager

fm = FontManager()
mat_fonts = set(f.name for f in fm.ttflist)
print(mat_fonts)

在Matplotlib中是使用字体名来配置字体的, 而不是字体的文件名, 因此你需要是从这里读到的字体名来进行下面的配置, 同时也可以查看之前的添加字体操作是否成功.

修改Matplotlib的字体配置

修改Matplotlib的字体配置, 有两种方法:
一种是我们可以在代码中修改配置;
另外一种是我们可以去修改Matplotlib的配置文件;

在代码中修改配置

通过plt.rcParams['$config_item']就可以修改Matplotlib的字体配置选项.
Matplotlib中一共有五种类型的字体, 分别是:

plt.rcParams['font.serif']=['Sarasa Mono SC'] # 衬线字体
plt.rcParams['font.sans-serif']=['Sarasa Mono SC'] # 无衬线字体
plt.rcParams['font.cursive']=['Sarasa Mono SC'] # 手写字体
plt.rcParams['font.fantasy']=['Sarasa Mono SC'] # 梦幻字体
plt.rcParams['font.monospace']=['Sarasa Mono SC'] # 等宽字体

直接修改配置文件

通过下面的代码可以读取到matplotlib的配置文件, 当然这个配置文件一般在$site-packages/matplotlib/mpl-data/matplotlibrc下:

import matplotlib

print(matplotlib.matplotlib_fname())

在这个文件搜索font.serif就会看到之前说的五大字体族了, 去掉前面的#号注释, 再在:前加上你的字体名就可以添加字体了的说.

最后的效果如图所示

QQ截图20180511151753.png