Python matplotlib绘制基础雷达图完整代码

码头散步
码头散步
发布时间:2026-11-04 | 8人浏览过
原创

本文提供使用 Python matplotlib 绘制基础雷达图的完整可执行代码,系统拆解极坐标投影、弧度等分、数据首尾闭合与刻度标签调优等核心实现细节。

数据可视化 运行环境:Python 3.x + Matplotlib + NumPy 图表类型:极坐标雷达图 (Radar / Spider Chart)
在 Python 中,Matplotlib 并没有提供类似于 plt.radar() 的直接绘图函数;绘制雷达图的通用标准方法,是通过创建极坐标子图(polar=True),将多维数值映射为极径($r$)、将维度均分映射为极角($ heta$),并利用 ax.plot() 与 ax.fill() 绘制封闭多边形。本文直接给出开箱即用的完整代码,并对“首尾闭合”与“方位对齐”等核心细节展开深度剖析。
Python matplotlib绘制基础雷达图完整代码
图 1:Matplotlib 极坐标雷达图结构示意(缩略图)

一、基础雷达图完整代码

以下是单组六维指标雷达图的标准完整代码。代码包含中文环境适配、弧度等分计算、首尾数据闭合拼接、极轴方位调整及多边形半透明填充,复制后即可直接执行并保存或展示图表。

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()
Python matplotlib绘制基础雷达图完整代码
图 2:Matplotlib 雷达图绘制的四步核心工作流

二、核心实现机制与关键步骤拆解

雷达图的绘图逻辑与常规折线图截然不同。在直角坐标系(笛卡尔坐标系)下,数据是基于 $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() 填充半透明区域时,绘图引擎会直接将断点与原点或起点相连,导致填充颜色在最后一个维度处出现严重的不规则撕裂。

Python matplotlib绘制基础雷达图完整代码
图 3:首尾闭合(Data Closure)机制对比:缺口效应 vs 完整封闭多边形

解决此问题的方法非常直接:在完成初始角度计算后,分别向 values 与 angles 数组的末尾各追加第一个元素:

values = np.concatenate((values, [values[0]]))
angles = np.concatenate((angles, [angles[0]]))

这样一来,数据点数量由 $N$ 变为 $N+1$,折线自然回绕到起点,形成闭合的凸(或凹)多边形。

Python matplotlib绘制基础雷达图完整代码
图 4:一维序列指标数据到极坐标平面 $( heta, r)$ 的数学转换与映射架构

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) 显式指定固定的刻度上下限
Python matplotlib绘制基础雷达图完整代码
图 5:Matplotlib 雷达图核心参数速查与调优清单(总结图)

五、总结

Matplotlib 绘制基础雷达图的核心不在于复杂的几何计算,而在于清晰掌握极坐标体系下的数据映射规则:

  1. 使用 subplot_kw=dict(polar=True) 开启极坐标环境。
  2. 通过 np.linspace(..., endpoint=False) 均匀切割全圆弧度。
  3. 在绘图前严格执行首尾数据追加,确保多边形边框与填充区域闭合。
  4. 借助 set_theta_offset 与 set_theta_direction 修正正北朝向与顺时针视线顺序。

掌握这一标准规范后,即可根据业务指标数量灵活扩展维度,或叠加多组对比样本,输出具备工业级可读性与专业排版的数据可视化图表。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表