Python matplotlib绘制基础雷达图完整代码
本文提供使用 Python matplotlib 绘制基础雷达图的完整可执行代码,系统拆解极坐标投影、弧度等分、数据首尾闭合与刻度标签调优等核心实现细节。
plt.radar() 的直接绘图函数;绘制雷达图的通用标准方法,是通过创建极坐标子图(polar=True),将多维数值映射为极径($r$)、将维度均分映射为极角($ heta$),并利用 ax.plot() 与 ax.fill() 绘制封闭多边形。本文直接给出开箱即用的完整代码,并对“首尾闭合”与“方位对齐”等核心细节展开深度剖析。
一、基础雷达图完整代码
以下是单组六维指标雷达图的标准完整代码。代码包含中文环境适配、弧度等分计算、首尾数据闭合拼接、极轴方位调整及多边形半透明填充,复制后即可直接执行并保存或展示图表。
import matplotlib.pyplot as plt
import numpy as np
# 1. 设置中文字体与负号正常显示
plt.rcParams['font.sans-serif'] = ['PingFang SC', 'Microsoft YaHei', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 2. 定义评估指标名称与数值
labels = np.array(['攻击力', '防御力', '机动性', '生存力', '控制力', '辅助力'])
values = np.array([88, 72, 95, 68, 80, 60])
num_vars = len(labels)
# 3. 计算各个维度的对应角度(弧度制)
# 在 [0, 2π) 之间均匀分布 num_vars 个点,endpoint 必须为 False 避免终点 2π 与 0 重合
angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False)
# 4. 关键步骤:首尾数据与角度闭合
# 雷达图需构成完整多边形闭环,将起点数据追加至末尾
values = np.concatenate((values, [values[0]]))
angles = np.concatenate((angles, [angles[0]]))
# 5. 创建极坐标子图 (polar=True)
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
# 6. 设置起始角度(将第 1 个指标旋转至正北正上方)与顺时针方向
ax.set_theta_offset(np.pi / 2)
ax.set_theta_direction(-1)
# 7. 绘制多边形轮廓线与半透明填充
ax.plot(angles, values, color='#B96555', linewidth=2, linestyle='solid', label='角色属性')
ax.fill(angles, values, color='#B96555', alpha=0.25)
# 8. 绘制数据锚点
ax.scatter(angles, values, color='#B96555', s=36, zorder=10)
# 9. 设置刻度与标签(注意使用闭合前的 angles[:-1])
ax.set_xticks(angles[:-1])
ax.set_xticklabels(labels, fontsize=11, color='#30363C')
# 10. 设置径向范围 (半径 r) 与同心圆刻度
ax.set_ylim(0, 100)
ax.set_yticks([20, 40, 60, 80, 100])
ax.set_yticklabels(['20', '40', '60', '80', '100'], fontsize=9, color='#6B7280')
ax.set_rlabel_position(22.5) # 径向刻度文字向 22.5 度倾斜,避免与坐标射线遮挡
# 11. 美化网格线与图表边框
ax.grid(color='#D1CCC0', linestyle='--', linewidth=0.8)
ax.spines['polar'].set_color('#D1CCC0')
# 12. 图表标题与图例
plt.title('角色综合能力评估雷达图', fontsize=14, pad=24, color='#30363C', weight='bold')
plt.legend(loc='upper right', bbox_to_anchor=(1.15, 1.1), frameon=True)
plt.tight_layout()
plt.show()
二、核心实现机制与关键步骤拆解
雷达图的绘图逻辑与常规折线图截然不同。在直角坐标系(笛卡尔坐标系)下,数据是基于 $x$ 轴与 $y$ 轴的正交映射;而在极坐标系下,每一个数据点对应一个极角 $ heta$ 和一个极径 $r$。要确保图形正确无误,必须理解以下四个步骤:
1. 角度均分计算(`np.linspace`)
圆周的总弧度为 $2\pi$(约为 6.283)。如果有 $N$ 个指标,每个指标占用的扇区夹角即为 $2\pi / N$。使用 NumPy 的 np.linspace(0, 2 * np.pi, num_vars, endpoint=False) 生成等分角度数组。
endpoint=False 非常关键。如果设置为 True,第 $N$ 个点会落在 $2\pi$ 上,而 $2\pi$ 与 $0$ 在几何角度上完全重叠,将导致第一个扇区与最后一个扇区角度分配不均,维度标签位置发生偏移。
2. 数据与角度的“首尾闭合”(Data Closure)
这是初学者绘制雷达图最容易遗漏的细节。计算机在执行 plot 时,仅会按照数组顺序依次连接相邻两点。如果不人为干预,最后一个指标点 $P_{N-1}$ 到起点 $P_0$ 之间不会产生连线,从而留下一个明显的缺口。
更严重的是,当调用 ax.fill() 填充半透明区域时,绘图引擎会直接将断点与原点或起点相连,导致填充颜色在最后一个维度处出现严重的不规则撕裂。
解决此问题的方法非常直接:在完成初始角度计算后,分别向 values 与 angles 数组的末尾各追加第一个元素:
values = np.concatenate((values, [values[0]]))
angles = np.concatenate((angles, [angles[0]]))
这样一来,数据点数量由 $N$ 变为 $N+1$,折线自然回绕到起点,形成闭合的凸(或凹)多边形。
3. 极轴旋转与阅读习惯对齐
Matplotlib 极坐标图默认以数学极坐标为准:$0$ 弧度朝向正东(水平向右),且角度按逆时针方向递增。但在信息图表与工业雷达图中,绝大多数用户习惯将第一个核心维度放置在正北正上方,且按顺时针方向依次阅读各个指标。
ax.set_theta_offset(np.pi / 2):将整个极坐标系顺时针偏转 90 度,使起始角度对准正上方。ax.set_theta_direction(-1):将角度递增方向从默认的逆时针改为顺时针。
三、进阶示例:多组数据对比雷达图
在实际业务场景(如两名选手的属性对比、多款产品的参数跑分)中,往往需要在同一个雷达图内绘制多组数据。此时需要保持角度统一,只对不同对象的数值数组分别进行闭合拼接,并配置不同的线条颜色与半透明填充度。
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['PingFang SC', 'Microsoft YaHei', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 维度定义
categories = ['续航能力', '充电速度', '性能表现', '屏幕素质', '拍照画质', '机身质感']
N = len(categories)
# 样本 A 与 样本 B 数值
values_a = [85, 90, 78, 92, 88, 75]
values_b = [70, 75, 95, 85, 70, 90]
# 计算等分弧度
angles = np.linspace(0, 2 * np.pi, N, endpoint=False)
# 统一闭合角度,并对各自数值进行闭合处理
angles_closed = np.concatenate((angles, [angles[0]]))
values_a_closed = np.concatenate((values_a, [values_a[0]]))
values_b_closed = np.concatenate((values_b, [values_b[0]]))
# 创建极坐标画布
fig, ax = plt.subplots(figsize=(7, 7), subplot_kw=dict(polar=True))
ax.set_theta_offset(np.pi / 2)
ax.set_theta_direction(-1)
# 绘制产品 A (砖红色调)
ax.plot(angles_closed, values_a_closed, color='#B96555', linewidth=2, label='旗舰机型 A')
ax.fill(angles_closed, values_a_closed, color='#B96555', alpha=0.2)
# 绘制产品 B (深石青色调)
ax.plot(angles_closed, values_b_closed, color='#3D6B8C', linewidth=2, label='竞品机型 B')
ax.fill(angles_closed, values_b_closed, color='#3D6B8C', alpha=0.2)
# 坐标轴与网格设置
ax.set_xticks(angles)
ax.set_xticklabels(categories, fontsize=11, color='#30363C')
ax.tick_params(pad=12) # 增加文字与雷达外圈的外边距
ax.set_ylim(0, 100)
ax.set_yticks([25, 50, 75, 100])
ax.set_yticklabels(['25', '50', '75', '100'], fontsize=9, color='#6B7280')
ax.set_rlabel_position(30)
plt.title('旗舰机型多维性能评测对比', fontsize=14, pad=24, weight='bold')
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1.1))
plt.tight_layout()
plt.show()
四、高频排障与排版调优速查
在实际绘制雷达图时,常会遇到中文字体缺失、维度文字紧贴图表边缘挤压等问题。以下总结了核心解决方案:
| 异常现象 / 需求 | 根本原因 | 推荐解决代码 |
|---|---|---|
| 中文字体显示为方块豆腐块或乱码 | 系统默认 sans-serif 字体库未包含中文字形 | plt.rcParams['font.sans-serif'] = ['PingFang SC', 'Microsoft YaHei', 'SimHei'] |
| 雷达多边形最后一条边缺失(呈 C 字形) | 未在数组末尾追加第 0 个数据闭合点 | values = np.concatenate((values, [values[0]])) |
| 维度标签文字被最外层网格线切断或紧贴 | 默认轴刻度与标签 padding 间距为 0 | ax.tick_params(pad=14) 或在 set_xticklabels 中指定 pad |
| 同心圆刻度数字与坐标射线重叠无法看清 | 默认刻度文字与 0 度极轴处于同一径向位置 | ax.set_rlabel_position(22.5) 将文字偏转至两根射线中间的扇区 |
| 各组数据图形大小基准失真 | 未显式限定极径范围,系统自动按数据最大值自适应缩放 | ax.set_ylim(0, max_val) 显式指定固定的刻度上下限 |
五、总结
Matplotlib 绘制基础雷达图的核心不在于复杂的几何计算,而在于清晰掌握极坐标体系下的数据映射规则:
- 使用
subplot_kw=dict(polar=True)开启极坐标环境。 - 通过
np.linspace(..., endpoint=False)均匀切割全圆弧度。 - 在绘图前严格执行首尾数据追加,确保多边形边框与填充区域闭合。
- 借助
set_theta_offset与set_theta_direction修正正北朝向与顺时针视线顺序。
掌握这一标准规范后,即可根据业务指标数量灵活扩展维度,或叠加多组对比样本,输出具备工业级可读性与专业排版的数据可视化图表。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













