Python的星图
星图或雷达图用于显示多变量数据,其中每个变量提供每个观察的一些共同属性的度量。图中的每颗星代表一次观察。星图用于检查单个数据点的相对值并定位相似和不同的点。
星图由一系列称为半径的等角辐条组成,每个辐条代表对其中一个变量的观察值。辐条的数据长度与该变量中与最大数据点相关的点的变量大小成正比。绘制一条连接所有数据点的线
星图可用于回答以下问题:
- 对于给定的观察,哪个变量占主导地位?
- 哪些观察最相似,即是否有任何观察聚类?
- 有异常值吗?
应用
- Star plot一般用于FIFA、Pro Evolution Soccer (PES)等体育可视化和游戏中,以可视化玩家的强项和弱项。
- 星图还可用于质量改进,以可视化不同的性能指标。
限制:
- 星图不是可视化不代表一个类别比另一个类别更好或更差的序数或分类变量的好方法。
- 星图有时会在两个不相关的变量之间建立联系。这就是为什么不能信任星图来做出权衡决定的原因。
- 变量的排序也会影响星图的形状。例如,值 9, 2, 9, 1, 9, 1 产生与 9, 9, 9, 2, 1, 1 不同的尖峰。
执行:
- 对于这个实现,我们将使用 plotly 和一些通用包。这些软件包预先安装在 colaboratory 中,但可以安装在本地环境中。要在本地环境中安装 plotly,请按照以下说明操作。
- 对于此实现,我们将使用 FIFA-19 球员数据集,您可以从 Kaggle 获取数据集。
Python3
# code
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
# read dataset from csv and perform preprocessing
data = pd.read_csv('data.csv')
data.head()
# remove goalkeepers data for performing fair comparison
goalkeeper_index = data[data['Position'] == 'GK' ].index
data.drop(index_names,inplace=True)
# remove columns which are not required for this visualisation purpose
plt_vars = ['SprintSpeed','Agility','Stamina','Aggression',
'Positioning','Vision']
data.drop(data_cols, axis =1, inplace=True)
# plot unfilled scatter plot
px.line_polar(data, r = pd.Series(data.loc[1,plt_vars].values),
theta=plt_vars,line_close=True,
title =
f'{data.loc[1,"Name"]} \n Overall : {data.loc[1,"Overall"]} \
Potential: {data.loc[1,"Potential"]}', width = 500)
# plot filled star plot
fig = go.Figure(data=go.Scatterpolar(
r=pd.Series(data.loc[0,plt_vars].values),
theta=plt_vars,
fill='toself',
name =
f'{data.loc[0,"Name"]} (Overall : {data.loc[0,"Overall"]} \
Potential: {data.loc[0,"Potential"]} )'),)
fig.update_layout(
polar=dict(
radialaxis=dict(
visible=True,
),
),
template = 'plotly_dark',
showlegend=True,
)
fig.show()
# plot star plot for comparison
fig = go.Figure()
fig.add_trace(go.Scatterpolar(
r=pd.Series(data.loc[1,plt_vars].values),
theta=plt_vars,
fill='toself',
name=data.loc[1, 'Name']
))
fig.add_trace(go.Scatterpolar(
r=pd.Series(data.loc[0,plt_vars].values),
theta=plt_vars,
fill='toself',
name=data.loc[0, 'Name']
))
fig.update_layout(
polar=dict(
radialaxis=dict(
visible=True
)),
template = 'plotly_dark',
showlegend=True
)
fig.show()
参考:
- NIST 笔记本