首页 > 编程笔记 > Python笔记 阅读:16

Python绘制雷达图(附带实例)

雷达图(Radar Chart)也称为蜘蛛图(Spider Chart)或星形图(Star Plot),是一种用于可视化多维数据的图表类型。

雷达图以一个多边形的形式来表示数据的不同维度或变量,并通过将每个变量的取值连接起来,形成一个闭合的图形来展示数据之间的关系和相对大小。

雷达图可以同时显示多个变量的相对大小和差异,能够直观地比较不同维度之间的差异和模式。特别适用于评估和比较多个方面或属性的性能、能力、优劣或优先级。通过雷达图可以更好地理解数据的多维特征,并发现其中的模式、异常或趋势。

雷达图在处理大量维度或数据量较大时可能会变得复杂和混乱。另外,雷达图在数据分布不平衡或缺失维度时也可能存在一定的局限性。因此,在使用雷达图时,应仔细选择和处理数据,确保图表清晰易读,并结合其他图表类型进行综合分析和解读。

【实例 1】输入如下代码:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 设置数据
df=pd.DataFrame({'group':['A','B','C','D','E'],
    'var1':[38,1.5,30,4,29],'var2':[29,10,9,34,18],
    'var3':[8,39,23,24,19],'var4':[7,31,33,14,33],
    'var5':[28,15,32,14,222]})

# ①处
# 获取变量列表
categories=list(df.columns[1:])
N=len(categories)

# 通过复制第 1 个值来闭合雷达图
values=df.loc[0].drop('group').values.flatten().tolist()
values+=values[:1]
# 计算每个变量的角度
angles=[n/float(N)*2*np.pi for n in range(N)]
angles+=angles[:1]

# 初始化雷达图
fig,ax=plt.subplots(figsize=(4,4),subplot_kw=dict(polar=True))
# 绘制每个变量的轴,并添加标签
plt.xticks(angles[:-1],categories,color='grey',size=8)
# 添加Y轴标签
ax.set_rlabel_position(0)
plt.yticks([10,20,30],["10","20","30"],color="grey",size=7)
plt.ylim(0,40)

ax.plot(angles,values,linewidth=1,linestyle='solid')  # 绘制数据
ax.fill(angles,values,'b',alpha=0.1)  # 填充区域
plt.show()
上述代码设置了一个包含 5 组数据的 DataFrame,每组数据有 5 个变量。通过取 DataFrame 中的变量名,设置雷达图的角度(categories 和 N),并将第 1 个组数据提取出来,以闭合雷达图。

接着初始化雷达图,并绘制每个变量的轴和标签,以及 Y 轴的标签和刻度。最后,通过 plot() 绘制数据线,并使用 fill() 填充数据区域。输出的结果如下图所示:


图 1 雷达图1

【实例 2】将上例 ① 处后的代码替换为以下代码:
# 第一部分:创建背景
categories=list(df[1:])  # 列出除 'group' 列外的所有列名
N=len(categories)  # 变量的数量

# 计算每个轴在图中的角度(将图分成多个等份,每个变量对应一个角度)
angles=[n/float(N)*2*np.pi for n in range(N)]
angles+=angles[:1]  # 为了闭合图形,将第 1 个角度再次添加到列表末尾

# 初始化雷达图
ax=plt.subplot(111,polar=True)
# 第 1 个轴在图的顶部
ax.set_theta_offset(pi/2)
ax.set_theta_direction(-1)

# 为每个变量添加标签
plt.xticks(angles[:-1],categories)  # 设置 X 轴标签

# 添加 Y 轴标签
ax.set_rlabel_position(0)
plt.yticks([10,20,30],["10","20","30"],color="grey",size=7)  # 设置 Y 轴刻度
plt.ylim(0,40)

# 第二部分:添加绘图
# 绘制第 1 个个体
values=df.loc[0].drop('group').values.flatten().tolist()  # 获取第一组值
values+=values[:1]  # 为了闭合图形,将第 1 个值再次添加到列表末尾
# 绘制线条
ax.plot(angles,values,linewidth=1,linestyle='solid',label="group A")  # 绘制线条
ax.fill(angles,values,'b',alpha=0.1)  # 填充颜色

# 绘制第 2 个个体
values=df.loc[1].drop('group').values.flatten().tolist()  # 获取第二组值
values+=values[:1]  # 为了闭合图形,将第 1 个值再次添加到列表末尾
ax.plot(angles,values,linewidth=1,linestyle='solid',
    label="group B")  # 绘制线条
ax.fill(angles,values,'r',alpha=0.1)  # 填充颜色

plt.legend(loc='upper right',bbox_to_anchor(0.1,0.1))  # 添加图例
plt.show()
上述代码通过计算角度和设置标签创建了一个具有合适刻度和标签的雷达图的背景。同时绘制了两组雷达图,通过 plot() 绘制线条,并通过 fill() 填充颜色,最后添加图例并显示图形。

输出的结果如下图所示:


图 2 雷达图2

【实例 3】创建一个雷达图,用于可视化给定数据集中的每个分组的变量值。输入如下代码:
import matplotlib.pyplot as plt
import pandas as pd
from math import pi

# 设置数据
df=pd.DataFrame({'group':['A','B','C','D'], 'var1':[38,1.5,30,4],
    'var2':[29,10,9,34],'var3':[8,39,23,24],
    'var4':[7,31,33,14], 'var5':[28,15,32,14]})

# 第一部分:定义一个函数来绘制数据表中的每一行
# make_spider(row,title,color):
# 变量的数量
categories=list(df[1:])
N=len(categories)
# 计算每个轴在图中的角度
angles=[n/float(N)*2*pi for n in range(N)]
angles+=angles[:1]

ax=plt.subplot(1,4,row+1,polar=True)  # 初始化雷达图
# 如果希望第 1 个轴在顶部
ax.set_theta_offset(pi/2)
ax.set_theta_direction(-1)
# 为每个变量添加标签
plt.xticks(angles[:-1],categories,color='grey',size=8)
# 添加 Y 轴标签
ax.set_rlabel_position(0)
plt.yticks([10,20,30],["10","20","30"],color="grey",size=7)
plt.ylim(0,40)

# 绘制数据
values=df.loc[row].drop('group').values.flatten().tolist()
values+=values[:1]
ax.plot(angles,values,color=color,linewidth=2,linestyle='solid')
ax.fill(angles,values,color=color,alpha=0.4)

# 第二部分:将函数应用到所有数据
# 初始化图形
my_dpi=96
plt.figure(figsize=(1000/my_dpi,1000/my_dpi),dpi=my_dpi)
my_palette=plt.cm.get_cmap("Set2",len(df.index))

# 循环绘制雷达图
for row in range(0,len(df.index)):
    make_spider(row=row,title='group '+df['group'][row],color=my_palette[row])
上述代码定义了一个函数 make_spider() 来绘制每一行的雷达图。该函数计算了每个变量对应的角度,并对蜘蛛图的坐标轴进行初始化,对数据进行可视化。

最后,将每个变量的值连接起来,并根据颜色填充区域,添加标题。随后将函数应用到数据集中的每一行,并循环绘制雷达图。输出的结果如下图所示:


图 3 交互式雷达图

相关文章