Python matplotlib 绘图中文显示与负号修复完整指南

洛溪
洛溪
发布时间:2026-10-13| 2人浏览过
原创

本文详解 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 编程实践有所帮助。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。