matplotlib是python绘图的基础工具包,但长期以来它在处理中文显示方面存在不足,默认情况下会导致中文乱码。在windows系统中,可以通过修改matplotlibrc配置文件来解决这个问题。然而,在linux生产环境中批处理时,可能会遇到一些挑战,因为某些linux系统可能没有中文字体,且大多数提供的中文字体是ttc格式,而matplotlib只支持ttf格式。
Linux和Mac OS的问题是类似的,下面介绍如何彻底解决这一问题:
Windows
在Windows中解决这个问题非常简单,只需修改matplotlibrc配置文件中的字体相关参数即可。
Linux
假设你没有root权限,只能在个人用户中安装(如果有root权限会更方便)。
首先,检查系统中是否已经有支持的中文字体。
可以看到支持的中文字体都是ttc格式,生成的图表无法正确显示中文。
接下来,我们安装新的字体,从Windows中复制微软雅黑的ttf文件,并将其放置在当前用户主目录的.fonts文件夹中(如果没有此文件夹,请自行创建)。放置好字体文件后,执行fc-cache命令更新字体缓存,然后查看系统字体列表,你会发现新添加的字体已经生效。
将相应的字体文件复制到matplotlib的mpl-data/fonts/ttf目录下。
修改matplotlib的配置文件matplotlibrc中的font.serif和font.sans-serif选项(这是有衬线字体和无衬线字体,关于有衬线字体和无衬线字体的区别,可以自行搜索)。
注意:字体名称应为Microsoft YaHei,可以在fc-list :lang=zh的输出信息中找到。如果名称错误,将不会生效。
完成这些步骤后,绘图中的中文将不会再出现乱码。
Mac OS X
在OS X系统中,添加字体的操作与Linux类似,只是字体文件应放置在/Users/用户名/Library/Fonts/目录下。然后执行fc-cache命令更新字体缓存,同时将字体文件放到matplotlib/mpl-data/fonts/ttf目录下。剩余操作与Linux系统相同。
我已经在三个系统上测试过这些方法,最终都成功解决了问题。关于是否需要将文件复制到mpl-data路径下的问题,这可能不是必需的,因为我在Mac OS X上将文件复制到了mpl-data/fonts目录下,而不是mpl-data/fonts/ttf目录下,但仍然成功显示了中文。因此,可能只需将字体添加到系统字体中即可。如果这样做不行,还是建议将字体复制到mpl-data/fonts/ttf目录中。
关于是否需要更新matplotlib字体缓存的问题,这不是最关键的问题。你可以删除主目录下.matplotlib文件中的字体缓存文件,或者直接重启iPython也可以。