解决macOS下matplotlib无法显示中文的问题

in #matplotlib7 years ago

引言

Matplotlib是Python的一个不错的绘图框架,但是本身并不支持中文(默认配置中没有中文字体),所以如果绘图中出现了中文,会出现乱码。如图所示:
效果图0

下面我们就来看看,如何愉快地解决它吧!

本人环境:macOS/Python2.7&3.6 亲测可用

方法一:一劳永逸的方法(当然只是在你的机器上,无法迁移到别人机器)

  1. 下载你想要的字体(这里以SimHei.ttf字体为例)

http://www.fontpalace.com/font-details/SimHei/

  1. 查看matplotlib的字体存放目录与查找matplotlibrc文件路径

运行如下代码:

import matplotlib
matplotlib.matplotlib_fname()

得到一个matplotlib的matplotlibrc文件路径,我的是:

/Users/David/anaconda3/envs/py27/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc

字体目录就在与matplotlibrc文件同级的font/ttf目录中。也就是 .../matplotlib/mpl-data/fonts/ttf中,我的字体存放目录的完整路径如下

/Users/David/anaconda3/envs/py27/lib/python2.7/site-packages/matplotlib/mpl-data/fonts/ttf

请将下载好的字体,放入这个文件夹。

  1. 命令行运行如下两个命令,将matplotlib的字体缓存删除
cd ~/.matplotlib/
rm -rf fontList.py3k.cache

4.修改 matplotlibrc文件设置

找到下面呆着#注释的两行:

#font.family
#font.sans-serif

先将这两行前面的#去掉。再在第二行font.sans-serif的等号后面添加一项:SimHei。

5.在你的业务代码配置下载字体

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
  1. 成功显示中文
    效果图1

  2. 如果还不成功。请重启Python、电脑,我就是重启之后生效的!

方法二:针对业务代码,进行一些调整,费事,但是可迁移

在你的业务代码签名添加如下代码。你看其实这里可以很方便地调整字体大小的。size=15

from matplotlib.font_manager import FontProperties
def getChineseFont():  
    return FontProperties(fname='/System/Library/Fonts/PingFang.ttc',size=15)  

然后,针对plt的xlabel、ylabel、title等代码,添加如下属性。对,就是fontproperties=getChineseFont()。对于,legend,则需要添加prop=getChineseFont()

plt.title(u'乘客等级分布', fontproperties=getChineseFont()) #每一行都要添加,是不是很麻烦?
plt.ylabel(u'人数', fontproperties=getChineseFont())
plt.legend((u'头等舱',u'二等舱',u'三等舱',),loc='best',prop=getChineseFont())

效果如下:
效果图2

好啦,写完啦,撒花🎉