Python 雷达图中文标签乱码怎么解决

Hazel
Hazel
发布时间:2026-10-20| 4人浏览过
原创

在使用 Python 的 Matplotlib 库绘制雷达图时,极坐标各个维度上的中文标签(如“输出能力”、“敏捷度”、“防御力”等)经常会被渲染为空心方块(俗称“豆腐块”),并在终端中触发 UserWarning: Glyph missing from font(s) DejaVu Sans 警告。这个问题的根本原因在于 Matplotlib 默认配置的无衬线英文字体缺少中文字形映射表。解决该问题最直接且有效的方法是在绘图前将 plt.rcParams['font.sans-serif'] 配置为支持中文的字体列表,并同步关闭负号的 Unicode 字符替换。

速查解决代码

在所有绘图代码执行前,加入以下两行全局配置即可彻底解决默认环境下的中文标签缺失与负号方块问题:

import matplotlib.pyplot as plt

# 设置跨平台通用中文字体回退链
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'PingFang SC', 'Heiti SC', 'sans-serif']
# 正常显示负号,防止负号也显示为方块
plt.rcParams['axes.unicode_minus'] = False

一、雷达图中文标签乱码的成因剖析

雷达图本质上是建立在极坐标系(Polar Axes)上的多边形闭合图。在常规流程中,开发者会先通过 plt.subplot(polar=True) 或 fig.add_subplot(projection='polar') 创建极坐标画布,再通过 ax.set_thetagrids(angles, labels) 将文字标签绑定在各个角度的极轴外缘。

当 Matplotlib 准备将这些文本绘制到坐标轴时,其字体查找引擎会沿着内部的 font.sans-serif 优先列表检索可用字形。默认情况下,该列表首选是内置的 DejaVu Sans 字体。DejaVu Sans 仅包含基本的拉丁字母与部分西文字符集,完全不包含 Unicode 中的 CJK(中日韩统一表意文字)区块。当引擎发现输入的汉字在当前字体字典中无匹配字形时,便会调用备用的未定义字符图元(即方块框)替代输出,从而导致雷达图外周的所有维度标签集体乱码。

Python 雷达图中文标签乱码怎么解决
图 1:Matplotlib 雷达图标签渲染与乱码发生机制原理图

二、主流解决方案与实现步骤

针对不同运行环境(个人本地电脑、生产服务器或多团队协同代码库),解决雷达图中文乱码主要有两种方式:一是修改 Matplotlib 全局配置(rcParams),二是针对极轴文本对象单独传入字体属性(FontProperties)。

方法一:设置全局 rcParams(首选方案)

这种方法最为简洁,只需在脚本初始化阶段执行一次配置,后续所有绘制的雷达图、折线图、柱状图及其标题均能自动套用中文字体,无需逐个轴去修改属性。

由于代码可能会在不同的操作系统(Windows、macOS、Linux)上执行,建议在配置列表中写入多款常见字体的英文别名,让系统按顺序自动匹配:

  • Windows 系统常用:Microsoft YaHei(微软雅黑)、SimHei(黑体)。
  • macOS 系统常用:PingFang SC(苹方)、Heiti SC(黑体-简)。
  • Linux / 云主机常用:Noto Sans CJK SC(思源黑体)、WenQuanYi Micro Hei(文泉驿微米黑)。
Python 雷达图中文标签乱码怎么解决
图 2:全局 rcParams 字体配置执行流程图

方法二:使用 FontProperties 局部指定字体

如果当前环境属于无 root 权限的远程服务器或 Docker 容器,系统内可能压根没有安装微软雅黑或苹方字体。此时可以在项目根目录附带一个通用的 .ttf 或 .otf 中文字体文件(例如思源黑体 SourceHanSansSC-Regular.otf),并通过 FontProperties 精准绑定到极坐标刻度上:

from matplotlib.font_manager import FontProperties
import matplotlib.pyplot as plt

# 载入项目自带的中文字体文件
my_font = FontProperties(fname='./fonts/SourceHanSansSC-Regular.otf')

fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))

# 绘制雷达图维度标签并应用字体
angles = [0, 1.047, 2.094, 3.141, 4.188, 5.235]
labels = ['进攻', '防守', '机动', '控场', '爆发', '续航']

# set_thetagrids 返回刻度线和刻度文本对象列表
lines, text_labels = ax.set_thetagrids([a * 180 / 3.14159 for a in angles], labels)

# 逐一设置文本字体属性
for label in text_labels:
    label.set_fontproperties(my_font)

ax.set_title('角色综合能力评估', fontproperties=my_font, size=14, pad=20)
Python 雷达图中文标签乱码怎么解决
图 3:雷达图中文渲染方案对比与适用场景

三、配置后仍不生效?字体缓存排查

很多开发者在代码中明确写了 plt.rcParams['font.sans-serif'] = ['SimHei'],但运行后仍然报 Glyph missing,或者汉字依旧显示为方框。这种情况在 Windows 或新安装字体的环境中最为高发,根本原因在于 Matplotlib 的字体索引缓存未同步更新。

Matplotlib 在初次运行时会扫描系统字体目录,生成名为 fontlist-vXXX.json 的本地缓存字典。一旦缓存生成,后续即使在系统中新增了中文字体,Matplotlib 也不会主动感知,而是继续读取旧缓存。排查与清理步骤如下:

  1. 在终端或 Python 交互环境中打印当前环境的缓存路径:
    import matplotlib
    print(matplotlib.get_cachedir())
    # 输出示例:/Users/username/.matplotlib 或 C:\Users\username\.matplotlib
    
  2. 彻底关闭所有正在运行的 Python 进程或 Jupyter Notebook 内核。
  3. 进入上述打印的文件夹,直接删除该目录下的 fontlist-vXXX.json 缓存文件(或者清空整个缓存文件夹)。
  4. 重新运行雷达图绘制脚本,此时 Matplotlib 会重新扫描全量字体并重建缓存,中文标签便能恢复正常。

四、完整可运行的雷达图示例

下面是一个经过验证的完整雷达图脚本,包含了闭合多边形角度计算、坐标轴范围设置、中文标签映射以及网格线优化:

import numpy as np
import matplotlib.pyplot as plt

# 1. 解决中文乱码与负号方块
plt.rcParams['font.sans-serif'] = ['PingFang SC', 'Microsoft YaHei', 'SimHei', 'sans-serif']
plt.rcParams['axes.unicode_minus'] = False

# 2. 准备业务维度与数值(雷达图需要首尾闭合)
dimensions = ['击杀表现', '生存能力', '金币获取', '推塔节奏', '团战参团', '视野得分']
values = [88, 72, 90, 65, 84, 76]

# 计算各维度在极坐标系中的弧度
num_vars = len(dimensions)
angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist()

# 闭合数据点与角度数组
values += values[:1]
angles += angles[:1]

# 3. 创建极坐标画布
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))

# 4. 绘制雷达图折线与半透明填充
ax.plot(angles, values, color='#6B88A6', linewidth=2, linestyle='solid')
ax.fill(angles, values, color='#6B88A6', alpha=0.3)

# 5. 设置极轴刻度与中文标签
ax.set_thetagrids(np.degrees(angles[:-1]), dimensions, fontsize=11, color='#1E293B')

# 6. 微调刻度范围与样式
ax.set_ylim(0, 100)
ax.set_rgrids([20, 40, 60, 80, 100], angle=0, fontsize=8, color='#94A3B8')
ax.set_title("选手六维综合能力雷达图", fontsize=15, pad=20, color='#0F172A', fontweight='bold')

# 7. 导出或展示图像
plt.tight_layout()
plt.show()
Python 雷达图中文标签乱码怎么解决
图 4:雷达图中文乱码排查决策与排错路径树

五、注意事项与常见细节陷阱

  • 负号显示陷阱:如果雷达图中包含负值刻度,未设置 plt.rcParams['axes.unicode_minus'] = False 时,负号依然会显示为空白方块。这是因为 Matplotlib 默认会使用 Unicode 减号字符(\u2212),而大部分中文字体库仅实现了 ASCII 标准横杠(\u002D)。
  • 字体名称大小写敏感:部分 Linux 发行版与类 Unix 环境对字体名称大小写敏感。例如 simhei 可能匹配失败,应严格书写为 SimHei。
  • Jupyter Notebook 内联刷新:在交互式 Notebook 中执行 plt.rcParams 配置时,建议放在第一个 Cell 中运行;如果中间修改了字体,需调用 plt.close('all') 释放旧画布后重新生成图表。

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

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 算法库。