Matplotlib无内置radar_chart函数,需用plt.subplot(projection='polar')手动构建;须角度转换、数据闭合、归一化处理、中文字体配置及合理alpha与color设置。

matplotlib.pyplot.radar_chart 不存在,别白找
Matplotlib 没有内置的 radar_chart 函数,这是新手最常卡住的第一步。官方只提供基础绘图能力,雷达图得自己拼——用 plt.subplot(projection='polar') 搭底,再手动画轴、填数据。
常见错误现象:NameError: name 'radar_chart' is not defined 或搜了一圈文档没找到对应 API。
- 必须用
projection='polar'创建极坐标子图,这是雷达图的底层前提 - 角度要手动转换:n 维特征 → n 个等分角度(
np.linspace(0, 2*np.pi, len(labels), endpoint=False)) - 数据需首尾闭合(
data.append(data[0])),否则连线断开 - 注意 Matplotlib 3.8+ 对
polar坐标下fill()的默认行为变化:旧版自动闭合,新版需显式传closed=True
多组数据叠在一起时,fill() 顺序和 alpha 很关键
雷达图真正有用的地方是对比多组指标(比如模型 A/B/C 在准确率、召回率、F1、推理速度、内存占用上的表现)。但直接循环 ax.fill() 容易盖掉底层,看不清重叠区域。
- 按数据量由少到多、或透明度由高到低顺序绘制(先画最“薄”的那组)
-
alpha别设成 0.2 就完事——0.3~0.5 更平衡可读性与遮挡;超过 0.6 基本看不出叠加关系 - 务必配不同
color+ 稍粗linewidth=2的plot()边框,否则填色糊成一片 - 如果某组数据全为 0 或接近 0,
fill()可能塌缩成点,建议加最小值偏移(如np.clip(data, 0.05, None))防崩溃
中文标签显示方块、坐标轴刻度错位
用中文当特征名(如 ['准确率', '响应时间', '吞吐量'])时,plt.xticks() 显示的是方块 □□□,且文字常压在轴线上、旋转后还偏移。
立即学习“Python免费学习笔记(深入)”;
- 必须提前设置字体:用
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans'],避免依赖系统默认 - 极坐标下
xticks()的角度参数是弧度,但xticklabels()默认居中对齐,导致中文贴边——改用ax.set_xticks(angles); ax.set_xticklabels(labels, fontsize=10)并配合ax.tick_params(pad=10)拉开距离 - 如果 label 太长(如 '95% 分位响应延迟(ms)'),考虑缩写或换行:用
\n手动断行,但注意set_xticklabels()不自动换行,得传入列表如['95% 分位\n响应延迟', ...]
scale 不一致导致对比失真,别直接 plot 原始值
不同维度单位差异极大(比如准确率是 0~1,响应时间是 10~2000ms),不归一化就画雷达图,结果全是“响应时间”在撑大图形,其他维度挤成中心小圈。
- 必须做 min-max 或 z-score 归一化,推荐 min-max:
(x - x.min()) / (x.max() - x.min() + 1e-8),加1e-8防分母为 0 - 注意:归一化要在所有组、所有维度上统一用同一套
min/max,不能每组单独归一,否则失去横向可比性 - 如果某维度天然有理论边界(如准确率 ≤ 1.0),可用该边界替代观测最大值,更稳定
- 图例里一定要标注“已归一化”,否则读者误以为数值本身有意义
真正麻烦的是归一化策略选型——业务指标常有方向性(越高越好 vs 越低越好),反向指标得先取倒数或线性反转,这点容易被忽略,一画出来就误导结论。


















