【已解决,亲测有效】解决使用Python Matplotlib库绘制图表中出现中文乱码(中文显示为框)的问题的方法
【已解决,亲测有效】解决使用Python Matplotlib库绘制图表中出现中文乱码(中文显示为框)的问题的方法
文章目录
- 【已解决,亲测有效】解决使用Python Matplotlib库绘制图表中出现中文乱码(中文显示为框)的问题的方法
- 前言
- 1 问题分析:为什么会出现方框?
- 2 解决方案
- 2.1 方案一:动态指定(临时方案,推荐!)
- 2.2 方案二:修改配置文件(一劳永逸)
- 3 总结
前言
在使用Python的Matplotlib
库进行数据可视化时,我们经常需要在图表的标题、坐标轴标签或图例中添加中文注释。然而,很多初学者都会遇到一个令人头疼的问题:设置好的中文全部显示成了“□”(方框),这也被称为“中文乱码”问题。本文将深入剖析这个问题产生的原因,并提供几种行之有效的解决方案,从临时解决到一劳永逸,总有一种适合你。
1 问题分析:为什么会出现方框?
让我们先来看一个简单的例子。当你尝试运行以下代码时,有很大概率会看到一张带有白色方框的图表。
import matplotlib.pyplot as plt
import numpy as np# 准备数据
x = np.arange(1, 6)
y = np.array([10, 8, 6, 4, 2])# 创建图表
plt.figure(figsize=(8, 6))
plt.plot(x, y, marker='o')# 添加中文标题和标签
plt.title("这是一个简单的折线图")
plt.xlabel("X轴:数据点")
plt.ylabel("Y轴:数值")# 显示图表
plt.show()
预期结果:一张带有中文标题和轴标签的折线图。
实际结果:
如上图所示,标题和坐标轴的中文部分全都变成了方框。
问题根源:
这背后的原因其实很简单:Matplotlib的默认字体库不包含中文字符。
Matplotlib默认使用的字体(如DejaVu Sans)是一款优秀的英文字体,但它没有设计中文字符的字形(Glyph)。当Matplotlib尝试渲染一个中文字符时,它在字体文件中找不到对应的字形,只能用一个占位符“□”来代替,表示“此字符无法显示”。
2 解决方案
知道了问题根源,解决思路就很清晰了:为Matplotlib指定一个包含中文字符的字体。
2.1 方案一:动态指定(临时方案,推荐!)
这是最常用、最灵活的方法,尤其适用于在不同的项目或环境中工作。它只在当前运行的Python脚本中生效,不会影响全局配置。
核心代码:通过 matplotlib.rcParams
来动态修改配置。
步骤:
- 在绘图代码的开头,引入
matplotlib
。 - 通过
plt.rcParams
或matplotlib.rcParams
设置字体。 - 【关键】 解决负号显示问题。更换字体后,可能会导致坐标轴的负号
-
也显示为方框,因为一些中文字体不处理Unicode的减号(U+2212),而是使用ASCII的连字符(-)。我们需要将axes.unicode_minus
设置为False
来解决这个问题。
下面是修改后的完整代码:
import matplotlib.pyplot as plt
import numpy as np# --- 新增代码开始 ---
# Windows系统
plt.rcParams['font.sans-serif'] = ['SimHei'] # 'SimHei' 是黑体的文件名
# Mac系统
# plt.rcParams['font.sans-serif'] = ['PingFang SC']
# Linux系统(需要确认已安装的字体)
# plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei']plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# --- 新增代码结束 ---# 准备数据
x = np.arange(-5, 6)
y = x**2# 创建图表
plt.figure(figsize=(8, 6))
plt.plot(x, y, marker='o')# 添加中文标题和标签
plt.title("二次函数 $y = x^2$ 图像")
plt.xlabel("X轴:自变量")
plt.ylabel("Y轴:因变量")
plt.grid(True)# 显示图表
plt.show()
修改后,生成的图表即可正常显示:
如何找到可用的中文字体?
- Windows:
SimHei
(黑体),KaiTi
(楷体),Microsoft YaHei
(微软雅黑) 等。 - macOS:
PingFang SC
(苹方),STHeiti
(华文黑体) 等。 - Linux:
WenQuanYi Micro Hei
(文泉驿微米黑),Noto Sans CJK SC
等。需要通过fc-list :lang=zh
命令查看已安装的中文字体。
优点:
- 代码自包含,移植性强,在任何环境中只要有对应字体就能运行。
- 不污染全局配置,对其他Python项目无影响。
缺点:
- 需要在每个需要显示中文的脚本中都加入配置代码。
2.2 方案二:修改配置文件(一劳永逸)
如果你希望在你的开发环境中永久解决这个问题,修改Matplotlib的配置文件是最佳选择。
步骤:
-
找到
matplotlibrc
配置文件
运行以下Python代码可以找到配置文件的路径:import matplotlib print(matplotlib.matplotlib_fname()) # 可能的输出: /path/to/your/python/env/lib/pythonX.X/site-packages/matplotlib/mpl-data/matplotlibrc
-
编辑配置文件
用文本编辑器打开上述路径找到的matplotlibrc
文件。
-
修改字体设置
在文件中找到#font.sans-serif
这一行(大约在276行左右)。- 去掉前面的
#
注释符。 - 在冒号后面添加你希望使用的中文字体名称,并确保它在列表的最前面。例如,在Windows上使用黑体:
# 找到这行: #font.sans-serif: DejaVu Sans, Bitstream Vera Sans, ...# 修改为 (去掉'#'并在最前面加上'SimHei'): font.sans-serif: SimHei, DejaVu Sans, Bitstream Vera Sans, ...
- 去掉前面的
-
修改负号设置
在文件中找到#axes.unicode_minus
这一行(大约在418行左右)。- 去掉前面的
#
注释符。 - 将
True
改为False
。# 找到这行: #axes.unicode_minus: True# 修改为: axes.unicode_minus: False
- 去掉前面的
-
清除缓存
这是非常关键的一步! Matplotlib会缓存字体信息,修改配置文件后必须清除缓存才能生效。
首先,找到缓存目录:import matplotlib print(matplotlib.get_cachedir())
然后,删除这个目录下的所有文件和文件夹。下次运行Matplotlib时会自动重新生成。
完成以上步骤后,你就可以像最开始那样运行代码,无需添加任何额外配置,中文和负号都能完美显示了。
优点:
- 一次配置,永久生效,非常方便。
缺点:
- 如果你的Python环境重装或迁移,需要重新配置。
- 配置是全局的,可能会影响所有使用该环境的Matplotlib项目。
3 总结
方案 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
方案一:动态指定 | 灵活,代码自包含,可移植性强 | 每个脚本都需要添加配置 | 共享代码、教学演示、不同项目切换 |
方案二:修改配置文件 | 一劳永逸,代码简洁 | 配置过程稍复杂,影响全局环境 | 个人固定开发环境 |
对于大多数开发者来说,方案一(动态指定)是首选,因为它能让你的代码更具鲁棒性和可移植性。而对于在个人电脑上进行大量数据分析工作的用户,方案二(修改配置文件) 则能提供极大的便利。
希望这篇文章能帮助你彻底告别Matplotlib的中文方框问题,让你的数据可视化作品更加清晰、美观!