matplotlib中文字体配置

matplotlib 是 Python 的优秀绘图包,但是不论是在 Windows 还是 Linux 中默认都是不支持中文的,尤其是在 Linux 中设置更加复杂一点,设置方法如下:

首先我们需要获取到 matplotlib 配置文件的文件夹

python -c "import matplotlib as mpl;print(mpl.get_configdir())"
/home/kevin/.config/matplotlib

然后需要一个默认的 matplotlibrc 文件用于修改

python -c "import matplotlib as mpl;print(mpl.matplotlib_fname())"
/opt/anaconda/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc

这个位置会根据每个人安装位置不同而改变

然后把默认的 rc 文件拷贝到用户的配置文件夹

cp /opt/anaconda/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc ~/.config/matplotlib

之后的工作都是围绕这个 rc 文件,一般情况下只需要修改如下两个字段,把注释打开。

font.sans-serif     : DejaVu Sans, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva
axes.unicode_minus  : False

第一个字段负责中文字体显示,但是目前还没有,第二个负责正负号的显示。

由于 matplotlib 不使用系统字体,所以需要找到一个 matplotlib 支持的字体且已在系统中

fc-list :lang=zh |grep -i ttf

在 shell 中执行这个命令,就能找到几个字体,选择一个填到上面第一行第一个即可,通常建议选择Droid Sans Fallback

修改好后重启整个 python 或 ipython 之后应该就可以看到中文,不过还是不可以的话可以使用下面方案二查找,这个方法出自segmentfault

#! /usr/bin/env python
# -*- coding: utf-8 -*-
from matplotlib.font_manager import FontManager
import subprocess

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

output = subprocess.check_output(
    'fc-list :lang=zh -f "%{family}\n"', shell=True)
output = output.decode('utf8')

zh_fonts = set(f.split(',', 1)[0] for f in output.split('\n'))
available = mat_fonts & zh_fonts

print('*' * 10, '可用的字体', '*' * 10)
for f in available:
    print(f)

如果不想使用 rc 文件来配置,那么可以在每次使用的时候在 python 中执行以下命令即可。

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['Droid Sans Fallback']
plt.rcParams['axes.unicode_minus']=False
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy