在 python 中为 Panda 数据框的每一行创建一个雷达图
Create a Radar Chart in python for each row of a Panda dataframe
我使用 panda 是为了给一些玩家打分。
我使用相同的 KPI 计算了每个玩家的一些属性,现在我为每个玩家计算了一行结果。
数据框看起来像这样(唯一的区别是它有更多的列):
|名称 |速度 |攻击力 |
| G1 | 0.32 | 0.89 |
| G4 | 0.31 | 0.76 |
我认为绘制雷达图会很好(https://en.wikipedia.org/wiki/Radar_chart)
对于每一行,使用 matplotlib(如果可能)。
你会怎么做?
有没有更好的matplotlib替代品?
谢谢。
要获得这种蜘蛛外观,您至少需要三列。因此,我在您的数据框中添加了一个 Random 列:
import pandas as pd
df = pd.DataFrame({"Name": ["G1", "G4"],
"Speed": [0.32, 0.31],
"ATK": [0.89, 0.76],
"Random": [0.4, 0.8]})
print(df)
# Name Speed ATK Random
#0 G1 0.32 0.89 0.4
#1 G4 0.31 0.76 0.8
现在,让我们看看如何绘制这个简单的数据框。以下代码改编自this博客post:
# import necessary modules
import numpy as np
import matplotlib.pyplot as plt
from math import pi
# obtain df information
categories = list(df)[1:]
values = df.mean().values.flatten().tolist()
values += values[:1] # repeat the first value to close the circular graph
angles = [n / float(len(categories)) * 2 * pi for n in range(len(categories))]
angles += angles[:1]
# define plot
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(8, 8),
subplot_kw=dict(polar=True))
plt.xticks(angles[:-1], categories, color='grey', size=12)
plt.yticks(np.arange(0.5, 2, 0.5), ['0.5', '1.0', '1.5'],
color='grey', size=12)
plt.ylim(0, 2)
ax.set_rlabel_position(30)
# draw radar-chart:
for i in range(len(df)):
val_c1 = df.loc[i].drop('Name').values.flatten().tolist()
val_c1 += val_c1[:1]
ax.plot(angles, val_c1, linewidth=1, linestyle='solid',
label=df.loc[i]["Name"])
ax.fill(angles, val_c1, alpha=0.4)
# add legent and show plot
plt.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1))
plt.show()
结果如下图:
我使用 panda 是为了给一些玩家打分。
我使用相同的 KPI 计算了每个玩家的一些属性,现在我为每个玩家计算了一行结果。
数据框看起来像这样(唯一的区别是它有更多的列):
|名称 |速度 |攻击力 |
| G1 | 0.32 | 0.89 |
| G4 | 0.31 | 0.76 |
我认为绘制雷达图会很好(https://en.wikipedia.org/wiki/Radar_chart) 对于每一行,使用 matplotlib(如果可能)。
你会怎么做?
有没有更好的matplotlib替代品?
谢谢。
要获得这种蜘蛛外观,您至少需要三列。因此,我在您的数据框中添加了一个 Random 列:
import pandas as pd
df = pd.DataFrame({"Name": ["G1", "G4"],
"Speed": [0.32, 0.31],
"ATK": [0.89, 0.76],
"Random": [0.4, 0.8]})
print(df)
# Name Speed ATK Random
#0 G1 0.32 0.89 0.4
#1 G4 0.31 0.76 0.8
现在,让我们看看如何绘制这个简单的数据框。以下代码改编自this博客post:
# import necessary modules
import numpy as np
import matplotlib.pyplot as plt
from math import pi
# obtain df information
categories = list(df)[1:]
values = df.mean().values.flatten().tolist()
values += values[:1] # repeat the first value to close the circular graph
angles = [n / float(len(categories)) * 2 * pi for n in range(len(categories))]
angles += angles[:1]
# define plot
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(8, 8),
subplot_kw=dict(polar=True))
plt.xticks(angles[:-1], categories, color='grey', size=12)
plt.yticks(np.arange(0.5, 2, 0.5), ['0.5', '1.0', '1.5'],
color='grey', size=12)
plt.ylim(0, 2)
ax.set_rlabel_position(30)
# draw radar-chart:
for i in range(len(df)):
val_c1 = df.loc[i].drop('Name').values.flatten().tolist()
val_c1 += val_c1[:1]
ax.plot(angles, val_c1, linewidth=1, linestyle='solid',
label=df.loc[i]["Name"])
ax.fill(angles, val_c1, alpha=0.4)
# add legent and show plot
plt.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1))
plt.show()
结果如下图: