您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python中如何使用matplotlib制作雷达图进行对比分析
## 一、雷达图简介与适用场景
### 1.1 什么是雷达图
雷达图(Radar Chart),又称蜘蛛网图(Spider Chart)或星状图(Star Plot),是一种以从同一点开始的轴上表示的三个或更多个定量变量的二维图表形式。它由多个等角度分布的轴组成,每个轴代表一个变量,数据点通过折线连接形成多边形。
### 1.2 雷达图的优势特点
- **多维度对比**:可同时展示5-8个维度的数据对比
- **直观性强**:通过形状面积和顶点位置快速识别数据特征
- **异常检测**:明显凸起或凹陷可直观反映指标异常
- **整体评估**:适合展示综合能力或性能的平衡性
### 1.3 典型应用场景
1. 员工能力评估(技术能力、沟通能力等多维度)
2. 产品特性对比(不同产品的性能参数比较)
3. 游戏角色属性分析(力量、敏捷、智力等属性)
4. 企业竞争力评估(财务、客户、运营等多维度)
## 二、Matplotlib基础与雷达图绘制原理
### 2.1 Matplotlib简介
Matplotlib是Python最著名的2D绘图库,提供类似MATLAB的绘图框架,支持多种图形输出格式和交互式环境。
安装命令:
```python
pip install matplotlib numpy
雷达图本质上是绘制在极坐标系(Polar Coordinates)中的折线图: - 角度轴:表示不同的维度/指标 - 径向轴:表示指标数值大小 - 多边形:连接各维度数据点形成
import numpy as np
import matplotlib.pyplot as plt
# 准备数据
categories = ['速度', '力量', '耐力', '敏捷', '智力']
values = [4, 3, 5, 2, 4]
N = len(categories)
# 计算角度
angles = np.linspace(0, 2*np.pi, N, endpoint=False).tolist()
values += values[:1] # 闭合图形
angles += angles[:1]
# 创建极坐标图
fig, ax = plt.subplots(figsize=(6,6), subplot_kw=dict(polar=True))
# 绘制填充区域
ax.fill(angles, values, 'b', alpha=0.2)
# 绘制数据线
ax.plot(angles, values, 'bo-', linewidth=2)
# 设置刻度标签
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
# 设置径向刻度
ax.set_rlabel_position(30)
plt.yticks([1,2,3,4,5], ["1","2","3","4","5"], color="grey", size=7)
ax.set_ylim(0,5)
plt.title('基础雷达图示例', size=15, y=1.1)
plt.show()
np.linspace
:将圆周等分为N份subplot_kw=dict(polar=True)
:创建极坐标子图fill()
方法:填充多边形区域set_xticks()
:设置维度标签位置set_rlabel_position()
:设置径向标签位置# 准备对比数据
player1 = [4, 3, 5, 2, 4]
player2 = [3, 4, 2, 5, 3]
N = len(categories)
angles = np.linspace(0, 2*np.pi, N, endpoint=False).tolist()
player1 += player1[:1]
player2 += player2[:1]
angles += angles[:1]
fig, ax = plt.subplots(figsize=(8,8), subplot_kw=dict(polar=True))
# 绘制两组数据
ax.plot(angles, player1, 'bo-', linewidth=2, label='选手A')
ax.fill(angles, player1, 'b', alpha=0.2)
ax.plot(angles, player2, 'ro-', linewidth=2, label='选手B')
ax.fill(angles, player2, 'r', alpha=0.2)
# 设置标签和样式
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
ax.set_rlabel_position(0)
plt.yticks([1,2,3,4,5], ["1","2","3","4","5"], color="grey", size=7)
ax.set_ylim(0,5)
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1))
plt.title('选手能力对比雷达图', size=15, y=1.1)
plt.show()
# 准备三组数据
data = {
'产品A': [8, 6, 7, 5, 9, 6],
'产品B': [5, 9, 6, 8, 4, 7],
'产品C': [7, 5, 8, 6, 7, 8]
}
categories = list(data.keys())
labels = ['设计', '性能', '续航', '价格', '服务', '生态']
# 创建画布
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, polar=True)
# 计算角度
angles = np.linspace(0, 2*np.pi, len(labels), endpoint=False).tolist()
# 绘制每组数据
for name, values in data.items():
values += values[:1]
_angles = angles + angles[:1]
ax.plot(_angles, values, 'o-', linewidth=2, label=name)
ax.fill(_angles, values, alpha=0.1)
# 设置标签
ax.set_xticks(angles)
ax.set_xticklabels(labels)
ax.set_rlabel_position(30)
plt.yticks(np.arange(1,10), [str(i) for i in range(1,10)])
ax.set_ylim(0,10)
plt.title('三款产品对比雷达图', size=15, y=1.1)
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1))
plt.show()
# 自定义颜色和样式
colors = ['#1f77b4', '#ff7f0e', '#2ca02c']
line_styles = ['-', '--', ':']
for idx, (name, values) in enumerate(data.items()):
values += values[:1]
ax.plot(angles + angles[:1], values,
color=colors[idx],
linestyle=line_styles[idx],
linewidth=2,
marker='o',
markersize=6,
label=name)
# 设置网格样式
ax.xaxis.grid(True, color='grey', linestyle='-', linewidth=0.5)
ax.yaxis.grid(True, color='grey', linestyle='--', linewidth=0.5)
# 设置背景
ax.set_facecolor('#f5f5f5')
# 在顶点添加数值标签
for angle, value, label in zip(angles, values[:-1], labels):
ax.text(angle, value+0.5, str(value),
ha='center', va='center',
fontsize=10, fontweight='bold')
# 自定义径向刻度
custom_ticks = [0, 3, 6, 9]
ax.set_yticks(custom_ticks)
ax.set_yticklabels([f'Level {i}' for i in custom_ticks], fontsize=8)
employees = {
'张三': {'技术':8, '沟通':6, '创新':7, '执行力':9, '学习':8},
'李四': {'技术':6, '沟通':9, '创新':5, '执行力':7, '学习':6},
'王五': {'技术':9, '沟通':5, '创新':8, '执行力':6, '学习':9}
}
# 转换为适合雷达图的数据格式
categories = list(employees['张三'].keys())
values = {name: list(emp.values()) for name, emp in employees.items()}
# 绘制代码...
products = {
'iPhone 15': {'性能':9, '相机':9, '续航':7, '屏幕':9, '生态':9, '价格':5},
'Galaxy S23': {'性能':8, '相机':8, '续航':8, '屏幕':9, '生态':7, '价格':6},
'Pixel 8': {'性能':7, '相机':9, '续航':6, '屏幕':8, '生态':6, '价格':7}
}
# 分析代码...
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 10))
scaled_values = scaler.fit_transform(np.array(values).reshape(-1,1))
# 调整标签位置
for label, angle in zip(ax.get_xticklabels(), angles):
if angle in [0, np.pi]:
label.set_horizontalalignment('center')
elif 0 < angle < np.pi:
label.set_horizontalalignment('left')
else:
label.set_horizontalalignment('right')
通过本文的详细讲解,相信您已经掌握了使用Matplotlib绘制雷达图进行多维度对比分析的完整方法。在实际应用中,建议根据具体场景选择合适的可视化方案,并不断优化图表以提高信息传达效率。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。