Python matplotlib 绘图中文显示与负号修复完整指南
本文详解 Python matplotlib 绘图时中文无法显示及负号丢失的问题。通过修改 font.sans-serif 添加 SimHei 字体解决中文乱码,并设置 axes.unicode_minus 为 False 修复负号显示异常,提供动态配置与静态修改两种方案及完整代码示例。
本文详细介绍 Python 中使用 matplotlib 进行绘图及配置中文显示的具体操作方法,供读者参考学习。
matplotlib 中文显示问题与字体配置
在使用 matplotlib 进行绘图时,默认配置下无法直接显示中文字符。例如,编写如下 Python 脚本:
#-*- coding: utf-8 -*-
from pylab import *
t = arange(-4*pi, 4*pi, 0.01)
y = sin(t)/t
plt.plot(t, y)
plt.title(u'钟形函数')
plt.xlabel(u'时间')
plt.ylabel(u'幅度')
plt.show()
运行后生成的图像如图 1 所示,可以观察到标题和坐标轴标签中的中文无法正常显示:

实际上,matplotlib 本身支持 Unicode 编码。出现图 1 中问题的主要原因是系统未找到合适的中文字体。在 matplotlib 的配置文件中,默认字体设置如下:
#font.family : sans-serif
#font.sans-serif : Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
可以看到默认配置中没有中文字体。因此,我们需要手动添加中文字体的名称。需要注意的是,这里添加的不是常见的“宋体”或“黑体”等中文名称,而是字体管理器识别出的具体字体名称。matplotlib 内置的字体管理器位于 font_manager.py 文件中,自动生成的可用字体信息保存在 fontList.cache 文件中。通过搜索该文件可以查看对应字体的名称,例如 simhei.ttf 对应的名称为 'SimHei',simkai.ttf 对应的名称为 'KaiTi_GB2312' 等。将这些名称添加到配置文件中即可让 matplotlib 正常显示中文。修改方法主要有两种:
1. 直接修改配置文件 matplotlibrc
在配置文件中找到 font.sans-serif 的设置项,然后添加所需的中文字体名称,例如:
font.sans-serif : SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
2. 动态设置(推荐方式)
在 Python 脚本中动态设置 matplotlibrc 参数,这样无需更改配置文件,更加灵活方便,例如:
mpl.rcParams['font.sans-serif'] = ['SimHei']
修改后的完整代码如下:
#-*- coding: utf-8 -*-
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
t = arange(-4*pi, 4*pi, 0.01)
y = sin(t)/t
plt.plot(t, y)
plt.title(u'钟形函数')
plt.xlabel(u'时间')
plt.ylabel(u'幅度')
plt.show()
运行后生成的图像如图 2 所示,此时标题和标签中的中文可以正常显示:

负号显示异常修复
然而仔细观察图 2 会发现结果并不完全正确。对比图 1 和图 2 的横坐标数值,可以发现图 2 中负轴的横坐标值出现了异常,负号消失了!这并非程序逻辑错误,而是由于更换字体后,新字体对负号的支持不足。在配置文件中,关于 axes 的相关设置如下:
#axes.unicode_minus : True
默认情况下,系统采用 unicode 的 minus 符号。由于所选字体对此支持不够,只需将其设置为 False 即可解决。最终代码如下:
#-*- coding: utf-8 -*-
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
t = arange(-4*pi, 4*pi, 0.01)
y = sin(t)/t
plt.plot(t, y)
plt.title(u'钟形函数')
plt.xlabel(u'时间')
plt.ylabel(u'幅度')
plt.show()
最终生成的图像如图 3 所示,所有元素显示均恢复正常。

更多关于 Python 相关内容的介绍,请参阅本站专题:《Python 数学运算技巧总结》、《Python 数据结构与算法教程》、《Python 函数使用技巧总结》、《Python 字符串操作技巧汇总》、《Python 入门与进阶经典教程》及《Python 文件与目录操作技巧汇总》。
希望本文的阐述能对大家的 Python 编程实践有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













