Linux下Python Matplotlib中文显示乱码的完整解决方案
本文详细解析在Linux CentOS 7环境下使用Python 2.7及Matplotlib绘制图表时中文显示为方框的问题。通过获取matplotlibrc路径、安装系统字体、修改配置文件及清除缓存等步骤,提供了一套完整的修复方案,确保横坐标等中文标签正常显示。
近期着手学习Python数据分析,通过爬虫获取数据后,计划利用Anaconda集成工具包(涵盖pandas、numpy、scipy、matplotlib及jupyter)开展初步的数据挖掘与分析工作。
在调用matplotlib生成图表时,发现横坐标若为中文,条形图的标签会显示为乱码“框框”。经查阅资料,这虽是常见现象且网络教程众多,但均未彻底解决我的具体困境。耗时约三小时摸索后终于解决,特此整理分享,供遇到同类问题的开发者参考。
运行环境配置如下:
Python 2.7 Linux CentOS 7
通过conda工具安装的matplotlib与pandas库。
问题描述:
使用matplotlib绘图时,中文字符无法正常显示。
原因分析:
Linux操作系统及matplotlib默认字体库中缺失可用的中文字体。 Matplotlib包默认仅支持ASCII码,不支持Unicode编码。
网络常见方案总结:
尝试修改matplotlib资源配置文件,例如强制指定“Simhei”字体(注:并非所有Linux系统均预装此字体,修改后往往无效)。 尝试在Linux系统中安装中文字体并同步修改matplotlib资源配置文件(实际测试中并未生效)。
解决方案:
综合网络上的多种方法,具体操作步骤如下:
1. 获取matplotlibrc配置文件的路径。在Jupyter Notebook中执行以下代码:
import matplotlib matplotlib.matplotlib_fname()
例如,该文件在我的系统中的路径为:
u'~/miniconda2/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc'
后续步骤将涉及修改此文件中的font相关参数。
2. 检查系统中所有字体及可用的中文字体。同样在Jupyter Notebook中执行:
from matplotlib.font_manager import FontManager
import subprocess
fm = FontManager()
mat_fonts = set(f.name for f in fm.ttflist)
print mat_fonts
output = subprocess.check_output(
'fc-list :lang=zh -f "%{family}\n"', shell=True)
print '*' * 10, '系统可用的中文字体', '*' * 10
print output
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
执行上述操作后,会发现“可用的字体”列表为空。这是因为matplotlib无法调用中文字体,导致中文显示为“框框”。
3. 若操作系统中缺失中文字体,需下载一个ttf格式的中文字体并在CentOS中安装。务必选择系统能识别font-family的字体,否则安装无效。
解压rar文件。在 /usr/share/fonts 路径下创建存放字体的文件夹yourfontdir,并将下载的ttf文件复制至该文件夹(建议将文件名改为英文名以便操作)。
4. 在CentOS系统中安装该字体。
cd /usr/share/fonts/yourfontsdir #生成字体索引信息. 会显示字体的font-family sudo mkfontscale sudo mkfontdir #更新字体缓存: fc-cache
5. 修改matplotlibrc配置文件。
对步骤1中获取的matplotlibrc文件进行配置修改。
取消font.family部分的注释,并在font.serif支持的字体列表中添加刚才下载的中文字体。此处添加的是之前下载的中文字体的font-family名称(可通过fc-list命令查找,建议提前记录)。本例中增加的是“WenQuanYi Zen Hei Mono”字体。
需取消以下语句的注释,否则中文减号也会显示为方块:
axes.unicode_minus : False
6. 最关键步骤:为matplotlib添加中文字体支持。
完成步骤5后,再次执行步骤2的操作,会发现“可用的中文字体”列表中已包含刚才安装的字体,但绘图时中文仍无法显示。这是因为虽然CentOS系统已安装该字体且告知matplotlib使用该字体,但matplotlib自身并未找到对应的ttf文件。因此,需要手动为其提供该文件。
将下载的ttf字体文件复制一份至以下路径:
~/miniconda2/lib/python2.7/site-packages/matplotlib/mpl-data/fonts/ttf
并删除相关的缓存文件。缓存路径位于:
~/.cache/matplotlib
删除其中与字体相关的缓存文件。
7. 现在重新绘制图表进行测试。问题已解决。
以上关于Linux系统中Python Matplotlib画图中文显示问题的解决方法即为全部内容,希望能对各位有所帮助,也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









