01
引言
雷达图Radar Chart,又称蜘蛛图或网络图,是一种用于比较多个定量变量的图形方法。它是一种二维极坐标可视化示例。
02
导入基础依赖库
我们将使用 Matplotlib库来实现雷达图的可视化,并使用NumPy库实现多个数学运算。
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')
请注意,上述代码中,我将matplotlib库中的样式设置为 ggplot,这样就可以设置自己喜欢的样式或使用默认样式。
03
数据准备
接下来的示例中,我们将使用雷达图直观地显示 Alice 和 Bob 这两名学生在五个科目中的分数。科目和分数以列表形式提供,如下:
subjects=['PHY','CHEM','BIO','MATH', 'ECO']
alice=[60,40,68,94,27]
bob=[81,30,75,37,46]
圆内总角为 360 度(2pi 弧度)。每个轴之间的夹角为 72 度(360/5)
Matplotlib 使用以弧度为单位的角度来绘制极坐标图。我们可以使用 numpy中的 linespace 函数来获取角度,如下所示。
angles=np.linspace(0,2*np.pi,len(subjects), endpoint=False)
print(angles)
结果如下:
[0. 1.25663706 2.51327412 3.76991118 5.02654825]
angles=np.concatenate((angles,[angles[0]]))
print(angles)
输出如下:
[0. 1.25663706 2.51327412 3.76991118 5.02654825 0.]
相应地,用于可视化的所有其他数组/列表也必须追加第一个值,以保持长度一致。
subjects.append(subjects[0])
alice.append(alice[0])
bob.append(bob[0])
04
绘制雷达图
准备好了上述数据,接着我们来绘制雷达图,这里通过在 add_subplot 函数中设置 polar=True 并提供角度和数值作为 plot 函数的参数,可以绘制基本的雷达图。
fig=plt.figure(figsize=(6,6))
ax=fig.add_subplot(polar=True)
ax.plot(angles,alice)
plt.show()
运行后,得到结果如下:
05
自定义雷达图
我们可以通过添加更多的信息来定制雷达图。
Line and Marker: 线条和标记样式可以通过在 plot 函数中提供参数来改变。在下面的代码中,线条和标记样式是通过使用位置参数来设置的,类似于matplotlib的折线图。线条颜色通过plot函数的 color 参数进行设置。 Fill the Plot Area:可以使用 fill 函数填充绘图区域,参数包括角度和数值。可以使用颜色和 alpha 参数设置颜色和不透明度。在比较多个实体时,最好使用对比色和较低的 alpha 值。
fig=plt.figure(figsize=(6,6))
ax=fig.add_subplot(polar=True)
#basic plot
ax.plot(angles,alice, 'o--', color='g', label='Alice')
#fill plot
ax.fill(angles, alice, alpha=0.25, color='g')
#Add labels
ax.set_thetagrids(angles * 180/np.pi, subjects)
plt.grid(True)
plt.tight_layout()
plt.legend()
plt.show()
运行结果如下:
06
绘制多个对象
最后,我们来到了本教程中令人期待的部分,即 "爱丽丝如何对抗鲍勃? 我们需要将爱丽丝和鲍勃的雷达图合并到同一个图表中,就可以回答这个问题。
代码如下:
fig=plt.figure(figsize=(6,6))
ax=fig.add_subplot(111, polar=True)
#Alice Plot
ax.plot(angles,alice, 'o-', color='g', linewidth=1, label='Alice')
ax.fill(angles, alice, alpha=0.25, color='g')
#Bob Plot
ax.plot(angles,bob, 'o-', color='orange', linewidth=1, label='Bob')
ax.fill(angles, bob, alpha=0.25, color='orange')
ax.set_thetagrids(angles * 180/np.pi, subjects)
plt.grid(True)
plt.tight_layout()
plt.legend()
plt.show()
运行后,得到结果如下:
通过雷达图,我们可以发现爱丽丝的数学成绩比鲍勃好很多。他们在生物和化学方面的表现不相上下。这就是雷达图的优点,当比较多个实体的多个变量时,它非常容易理解。
07
本文重点介绍利用matplotlib库来绘制雷达图的方法,一般来说,雷达图适合比较 2-4 个实体和 3-10 个定量变量。实体或变量的数量越多,图表就越杂乱,难以理解。
您学废了吗?
代码链接:https://github.com/hashABCD/Publications/tree/main/Medium/Radar%20Chart
点击上方小卡片关注我
添加个人微信,进专属粉丝群!