Python Matplotlib与Pyecharts绘制雷达图代码对比
详细对比Python中使用Matplotlib与Pyecharts绘制雷达图的实现代码、核心原理、数据闭环处理逻辑及在交互报表与静态科研图表中的选型差异。
雷达图(Radar Chart)又称极坐标多维图或戴布拉图,适合用来展示实体在多个定性或定量指标上的综合表现。在Python生态中,绘制雷达图主要有两大流派:一是以底层绘图控制著称的 Matplotlib,它依托极坐标轴(Polar Projection)由开发者手动构建多边形;二是以Web前端引擎驱动的 Pyecharts,它通过声明式配置开箱即用支持悬停提示和动态渲染。本文将基于统一的评价数据集,从代码结构、实现机制、配置差异到场景选型展开全面对比,帮助开发者快速掌握两种工具的核心异同并准确技术定型。
一、基准对比数据设定
为了保证两套代码在横向对比时的公平性,我们设定一套工程师技能画像评估数据。包含6个技能维度,并对比“候选人A”与“岗位基准线”的得分情况:
- 评估指标(6个维度):Python编程、算法基础、系统架构、工程规范、自动化运维、沟通协作
- 候选人A得分:[88, 76, 85, 92, 70, 80]
- 岗位基准要求:[80, 80, 75, 80, 80, 75]
- 各维度最高满分:统一设定为 100 分
二、Matplotlib 绘制雷达图:极坐标下的几何构建
在 Matplotlib 中并没有现成的 plt.radar() 接口。实现雷达图的标准做法是将子图的投影方式设置为极坐标 polar=True,然后通过三角函数分配圆周角,将折线图的首尾端点手动连接成闭合多边形。
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. 定义维度与数值
categories = ['Python编程', '算法基础', '系统架构', '工程规范', '自动化运维', '沟通协作']
values_a = [88, 76, 85, 92, 70, 80]
values_baseline = [80, 80, 75, 80, 80, 75]
num_vars = len(categories)
# 3. 计算每个维度的辐射角度(平均分割 2π)
angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False)
# 4. 手动完成闭环:将第一个点的值和角度追加到列表末尾
angles = np.concatenate((angles, [angles[0]]))
values_a = np.concatenate((values_a, [values_a[0]]))
values_baseline = np.concatenate((values_baseline, [values_baseline[0]]))
# 5. 创建极坐标子图
fig, ax = plt.subplots(figsize=(7, 7), subplot_kw=dict(polar=True))
# 设置极轴正方向:将 0 弧度置于正上方(12点钟方向),并顺时针排列
ax.set_theta_offset(np.pi / 2)
ax.set_theta_direction(-1)
# 设置维度文字标签与刻度
ax.set_thetagrids(np.degrees(angles[:-1]), categories, fontsize=11)
ax.set_ylim(0, 100)
ax.set_rgrids([20, 40, 60, 80, 100], labels=['20', '40', '60', '80', '100'], angle=0, color='#7F8C8D', fontsize=9)
# 6. 绘制数据折线与多边形填充
# 候选人A (主色调:鼠尾草绿)
ax.plot(angles, values_a, color='#879B88', linewidth=2, label='候选人A')
ax.fill(angles, values_a, color='#879B88', alpha=0.3)
# 岗位基准 (主色调:灰蓝虚线)
ax.plot(angles, values_baseline, color='#687D8D', linewidth=1.8, linestyle='--', label='岗位基准')
ax.fill(angles, values_baseline, color='#687D8D', alpha=0.15)
# 7. 标题与图例修饰
plt.title('候选人综合能力评估 (Matplotlib)', size=14, weight='bold', y=1.08)
plt.legend(loc='upper right', bbox_to_anchor=(1.25, 1.1), frameon=True)
plt.tight_layout()
plt.savefig('radar_matplotlib.png', dpi=300)
plt.show()
1. 必须使用 angles[:-1] 传递刻度位置,因为闭合后 angles 有 7 个元素,但刻度标签只有 6 个;若传入 7 个会导致刻度重叠或抛出异常。
2. 极坐标默认 0 弧度在正右方(3点钟方向)且逆时针旋转。常规商业雷达图习惯将第 1 个指标置于顶部(12点钟),因此 ax.set_theta_offset(np.pi / 2) 和 ax.set_theta_direction(-1) 是保证排版符合直觉的关键操作。
三、Pyecharts 绘制雷达图:基于声明式的组件装配
与 Matplotlib 偏底层的坐标变换不同,Pyecharts 是百度 ECharts 的 Python 封装。它直接提供了雷达图专用的 Radar 类,开发者只需定义 schema(指标列表与每个维度的量程上限)和数据系列,多边形的闭合与坐标映射均由底层 JavaScript 引擎自动完成。
Pyecharts 完整实现代码
from pyecharts import options as opts
from pyecharts.charts import Radar
# 1. 定义维度规范与各维度量程上限 (schema)
schema_list = [
opts.RadarShapeItem(name="Python编程", max_=100),
opts.RadarShapeItem(name="算法基础", max_=100),
opts.RadarShapeItem(name="系统架构", max_=100),
opts.RadarShapeItem(name="工程规范", max_=100),
opts.RadarShapeItem(name="自动化运维", max_=100),
opts.RadarShapeItem(name="沟通协作", max_=100),
]
# 2. 准备数据集 (原始列表即可,无需手动补首项)
data_a = [[88, 76, 85, 92, 70, 80]]
data_baseline = [[80, 80, 75, 80, 80, 75]]
# 3. 初始化雷达图并配置结构
radar = (
Radar(init_opts=opts.InitOpts(width="720px", height="520px"))
.add_schema(
schema=schema_list,
shape="polygon", # 雷达网格形状:支持 "polygon" (多边形) 或 "circle" (同心圆)
splitarea_opt=opts.SplitAreaOpts(
is_show=True,
areastyle_opts=opts.AreaStyleOpts(opacity=0.1)
),
textstyle_opts=opts.TextStyleOpts(color="#2C3E50", font_size=12),
)
# 添加候选人A系列
.add(
series_name="候选人A",
data=data_a,
color="#879B88",
areastyle_opts=opts.AreaStyleOpts(opacity=0.3),
linestyle_opts=opts.LineStyleOpts(width=2),
)
# 添加基准对照系列
.add(
series_name="岗位基准",
data=data_baseline,
color="#687D8D",
areastyle_opts=opts.AreaStyleOpts(opacity=0.15),
linestyle_opts=opts.LineStyleOpts(width=1.8, type_="dashed"),
)
# 全局样式与交互提示配置
.set_global_opts(
title_opts=opts.TitleOpts(title="候选人综合能力评估 (Pyecharts)", pos_left="center"),
legend_opts=opts.LegendOpts(pos_top="30px"),
tooltip_opts=opts.TooltipOpts(trigger="item"),
)
)
# 4. 渲染为独立 HTML 文件
radar.render("radar_pyecharts.html")
四、关键维度对比与代码设计差异
在理解了具体代码与渲染管线后,我们可以将两者的开发差异归纳为以下四个核心维度:
| 对比维度 | Matplotlib 实现方式 | Pyecharts 实现方式 | 技术影响与开发体验 |
|---|---|---|---|
| API 抽象层级 | 底层面向对象与极坐标投影 (polar=True) |
高层图表类 (Radar) 声明式配置 |
Matplotlib需要显式操控坐标变换,Pyecharts开箱即用 |
| 数据闭环处理 | 必须手动拼接首元素 (np.concatenate) |
自动闭合,传入原始指标数值即可 | Matplotlib漏掉闭合会导致图形缺角,属于高频新手错误 |
| 指标量程定制 | 共享全局径向范围 (ax.set_ylim) |
每个维度可在 RadarShapeItem 单独设 max_ |
当各指标量纲不一致(如得分100分与时长60秒)时,Pyecharts更灵活 |
| 多系列绘制机制 | 多次调用 ax.plot() 与 ax.fill() |
链式调用 .add() 传入多组系列数据 |
Pyecharts在多系列聚合与图例自动关联上代码更精简 |
| 交互与动画 | 静态无交互,需额外GUI框架或嵌入Notebook交互 | 原生支持鼠标悬停浮窗(Tooltip)、图例过滤点击与平滑补间动画 | 商业交付与管理层汇报中 Pyecharts 的视觉与交互体验更优 |
| 产物输出媒介 | 静态文件(PNG、PDF、SVG、EPS)或内联静态图 | HTML独立网页、Jupyter交互挂件或通过Snapshot转图片 | 科研学术、LaTeX排版首选Matplotlib,网页大屏首选Pyecharts |
五、选型决策指南与避坑建议
在实际工程项目中,选择哪个工具取决于图表最终的交付媒介、对交互性的要求以及维度的量纲特征。
实际应用避坑提醒
- 雷达图维度数量控制:建议雷达图的评估维度保持在 4 到 8 个之间。少于 4 个指标时多边形趋于扁平,退化为普通线段;多于 8 个指标时轴线过于密集,文字标签极易重叠,此时水平条形图往往是更优表达。
- 不同量纲归一化:使用 Matplotlib 时,由于极轴半径尺度全局统一,如果各指标量纲不同(如一个指标是 0~1 的比率,另一个指标是 0~10000 的业务量),未做归一化会导致小数值指标缩在原点无法识别。而在 Pyecharts 中,可通过为每个指标显式声明
max_来缓解这一问题,但在严谨对比时仍推荐在输入数据前统一做 Min-Max 归一化。 - 透明度设置:当展示两个或多个实体时,多边形填充颜色务必设置合理的透明度(如
alpha=0.2 ~ 0.35),否则顶层的色块会完全遮挡底层轮廓,导致重叠区域的数据失真。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









