如何解决 matplotlib 显示中文时变成方框或乱码?
时间: 2025-09-26 11:18:04 AIGC 浏览: 56
在使用 `matplotlib` 绘图时,如果图表中的中文显示为**方框、问号或乱码**,这是因为 `matplotlib` 默认使用的字体不支持中文。
---
### ✅ 问题原因
`matplotlib` 内置的默认字体(如 `DejaVu Sans`)**不包含中文字形**,因此无法渲染中文字符。
---
### ✅ 解决方案:设置支持中文的字体
我们可以通过修改 `matplotlib` 的 `rcParams` 来指定一个支持中文的字体,例如:
- **Windows**: `SimHei`(黑体)
- **macOS**: `PingFang SC`、`Heiti SC`
- **Linux**: `WenQuanYi Micro Hei`(文泉驿微米黑)
下面提供几种通用且有效的解决方法。
---
### ✅ 方法 1:全局设置中文字体(推荐)
```python
import matplotlib.pyplot as plt
# 设置中文字体和解决负号显示问题
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'WenQuanYi Micro Hei'] # 尝试多种中文字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号 '-' 显示为方块的问题
# 示例绘图
plt.plot([1, 2, 3], [4, 5, 6])
plt.title("中文标题测试")
plt.xlabel("X轴标签")
plt.ylabel("Y轴标签")
plt.show()
```
> ✅ `plt.rcParams['axes.unicode_minus'] = False` 非常重要!否则负号会变成方框。
---
### ✅ 方法 2:手动指定具体字体路径(精确控制)
如果你知道系统中某个中文字体文件的位置(如 `.ttf` 文件),可以手动加载:
```python
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 指定字体文件路径(以 Windows 为例)
font_path = "C:/Windows/Fonts/simhei.ttf" # 黑体
zh_font = fm.FontProperties(fname=font_path)
# 绘图时使用该字体
plt.plot([1, 2, 3], [4, 5, 6])
plt.title("中文标题", fontproperties=zh_font)
plt.xlabel("X轴", fontproperties=zh_font)
plt.ylabel("Y轴", fontproperties=zh_font)
plt.show()
```
> 💡 可通过以下代码查看所有可用字体:
>
> ```python
> import matplotlib.font_manager as fm
> for f in fm.findSystemFonts():
> print(fm.FontProperties(fname=f).get_name())
> ```
---
### ✅ 方法 3:添加自定义字体(高级用法)
你也可以将一个中文字体文件(如 `NotoSansCJK-Regular.ttc`)复制到项目目录,并注册:
```python
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
# 注册字体
font_path = "./NotoSansCJK-Regular.ttc" # 下载后放入当前目录
fm.fontManager.addfont(font_path)
prop = fm.FontProperties(fname=font_path)
# 设置为默认字体
plt.rcParams['font.family'] = prop.get_name()
plt.rcParams['axes.unicode_minus'] = False
# 测试
plt.plot([1,2,3], [1,4,9])
plt.title("这是Noto字体渲染的中文")
plt.show()
```
> ⬇️ 下载推荐字体:
> - [Google Noto CJK](https://www.google.com/get/noto/)(免费可商用)
> - 或从系统导出 `simhei.ttf`
---
### ✅ 各平台常用中文字体对照表
| 平台 | 中文字体名(英文) | 对应中文风格 |
|--------|--------------------------|-------------|
| Windows | `SimHei` | 黑体 |
| | `Microsoft YaHei` | 微软雅黑 |
| | `KaiTi` | 楷体 |
| macOS | `PingFang SC` | 苹方 |
| | `Heiti SC` | 黑体-简 |
| Linux | `WenQuanYi Micro Hei` | 文泉驿微米黑 |
你可以写一个跨平台兼容的配置:
```python
import platform
import matplotlib.pyplot as plt
system = platform.system()
if system == "Windows":
plt.rcParams['font.sans-serif'] = ['SimHei']
elif system == "Darwin": # macOS
plt.rcParams['font.sans-serif'] = ['PingFang SC', 'Heiti SC']
else: # Linux
plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei']
plt.rcParams['axes.unicode_minus'] = False
```
---
### ✅ 验证是否成功
运行以下代码测试中文是否正常显示:
```python
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(6, 3))
plt.text(0.5, 0.5, '中文显示正常!✅', fontsize=20, ha='center', va='center')
plt.axis('off')
plt.show()
```
如果看到“中文显示正常!✅”,说明已解决。
---
阅读全文
