1. 修改配置文件

在Ubuntu中使用matplotlib画图,python版本为2.7,中文不能正常显示。看样子应该是没有相关的中文字体的原因。Ubuntu中文经常使用文泉驿字体,从网上下载一个文泉驿的ttf格式的字体。因为matplotlib默认不识别ttf格式的字体,ttc和ttf的区别,简单来说就是许多个ttf(TrueType Font)打包成一个ttc(TrueType Font Collection),网上有工具进行转换。

首先找到字体的目录在哪里,输入下面代码查看下matplotlib的配置文件所在目录:

import matplotlib
matplotlib.matplotlib_fname()

我原来是把matplotlib安装在家目录,配置文件是~/.local/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc,那字体的目录应该是~/.local/lib/python2.7/site-packages/matplotlib/mpl-data/fonts,把下载好的字体放到ttf子目录下。 再修改配置文件~/.local/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc,去掉font.familyfont.sans-serif前面的注释,在font.sans-serif后面加个文泉驿字体WenQuanYi Micro Hei:

font.family         : sans-serif                                                
#font.style          : normal
#font.variant        : normal
#font.weight         : medium
#font.stretch        : normal
# note that font.size controls default text sizes.  To configure
# special text sizes tick labels, axes, labels, title, etc, see the rc
# settings for axes and ticks. Special text sizes can be defined
# relative to font.size, using the following values: xx-small, x-small,
# small, medium, large, x-large, xx-large, larger, or smaller
#font.size           : 10.0
#font.serif          : DejaVu Serif, Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
font.sans-serif     : WenQuanYi Micro Hei, DejaVu Sans, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

再把字体缓冲信息也删掉,让matplotlib重新更新下字体:

rm .cache/matplotlib/fontList.json

重新打开python画个图试试。

2. 指定字体名

上面修改配置文件比较麻烦,也可以直接指定对应的字体文件,在画图的时候直接使用就可以了。

import matplotlib as mpl
zhfont = mpl.font_manager.FontProperties(
    fname='wqy-microhei.ttf')

import matplotlib.pyplot as plt

plt.plot(range(10))
plt.title(u'年', size=32, fontproperties=zhfont)
plt.show()

不过如果经常使用的话,感觉还是修改配置文件一劳永逸。如果想让matplotlib识别ttc格式的,可能还需要修改代码,就感觉更麻烦了。

3. seaborn.set_style()问题

按照上面的方法在matplotlib画图,应该能正常显示。按照默认的设置下,seaborn中画图也能正常显示中文,不过如果你设置了其他风格的话,seaborn中不同风格带有不同的字体,这些可能会导致中文显示不正常,所以在使用时,应当手动指定字体:

import seaborn as sns 
sns.set_style('whitegrid', {'font.family':'WenQuanYi Micro Hei'})

这样就可以在其他风格中使用特定的字体了。

参考:

  1. https://gist.github.com/luw2007/7904664
  2. https://www.zhihu.com/question/25404709