项目介绍
Project Introduction
雷达图(Radar Chart),又称为蜘蛛网图或星形图,是一种将多个定量变量的多维数据通过视觉化的方式呈现出来的图表。在雷达图中,每个变量通常由一个轴线表示,所有轴线从同一点辐射出去,形成类似蜘蛛网的形状。数据点在轴线上的值用点表示,而点与点之间通过线段连接,形成一个多边形。雷达图常用于展示性能评估、系统比较以及指标分析等场景。它可以直观地显示多个样本或者时间点的数据,便于观察者对比各个样本在不同属性上的强弱和特征。
下图是图像美学质量评价中AADB数据集中的图像。为了更好的展示在我们训练的美学模型中的8个主要属性的输出值(predict)和这些属性真实值(true)的差别,我们采用雷达图对数据进行分析和可视化。

为了更好的贴近现实案例,这里展示7个学科的成绩数据为雷达图。我们使用极坐标系来绘制雷达图,每个学科的成绩数据对应一个角度,成绩值对应半径长度。通过这种方式,我们可以直观地比较各个学科的成绩。以下是代码实现:
准备工作
Preparation
1.导入所需的库
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
2.设置字体为黑体'SimHei',以便在图表中显示中文标签。
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
3.定义7个学科的标签和对应的成绩数据。
labels = np.array(["语文", "数学", "英语", "化学", "物理", "生物", "信息"])
dataLenth = 7 # 数据长度
data = np.array([90, 80, 70, 60, 50, 40, 30])
4.使用numpy的linspace函数来计算每个学科对应的角度,然后根据数据长度平均分割圆周长
angles = np.linspace(0, 2 * np.pi, dataLenth, endpoint=False) # 根据数据长度平均分割圆周长
5.为了闭合雷达图,将第一个数据添加到数据列表的末尾,并将第一个角度添加到角度列表的末尾。同样,也对标签进行封闭。
data = np.concatenate((data, [data[0]]))
angles = np.concatenate((angles, [angles[0]]))
labels = np.concatenate((labels, [labels[0]])) # 对labels进行封闭
6.创建一个图形对象,并设置其背景颜色为白色。
fig = plt.figure(facecolor="white")
7.使用plt.subplot函数创建一个极坐标图,并使用plt.plot函数绘制雷达图的边界线。
plt.subplot(111, polar=True) # 将图分成1行1列,画出位置1的图;设置图形为极坐标图
plt.plot(angles, data, color='b', linewidth=2)
8.使用plt.fill函数填充两条线之间的色彩,以表示各学科的成绩范围。
plt.fill(angles, data, facecolor='b', alpha=0.25) # 填充两条线之间的色彩,alpha为透明度
9.我们使用plt.thetagrids函数添加标签,并使用plt.grid函数添加网格线。
plt.thetagrids(angles * 180 / np.pi, labels) # 做标签
plt.grid(True)
10.我们使用plt.show函数显示雷达图。
plt.show()
注意事项
Things to Note
在设置字体时,需要确保系统中已经安装了黑体'SimHei'字体,否则可能会出现乱码。
在调整雷达图的颜色、透明度等参数时,可以根据需要进行调整,以达到最佳的可视化效果。
Python代码整体实现:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei' # 将字体设置为黑体'SimHei'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
labels = np.array(["语文", "数学", "英语", "化学", "物理", "生物", "信息"])
dataLenth = 7 # 数据长度
data = np.array([90, 80, 70, 60, 50, 40, 30])
angles = np.linspace(0, 2 * np.pi, dataLenth, endpoint=False) # 根据数据长度平均分割圆周长
# 闭合
data = np.concatenate((data, [data[0]]))
angles = np.concatenate((angles, [angles[0]]))
labels = np.concatenate((labels, [labels[0]])) # 对labels进行封闭
fig = plt.figure(facecolor="white") # facecolor 设置框体的颜色
plt.subplot(111, polar=True) # 将图分成1行1列,画出位置1的图;设置图形为极坐标图
plt.plot(angles, data, color='b', linewidth=2)
plt.fill(angles, data, facecolor='b', alpha=0.25) # 填充两条线之间的色彩,alpha为透明度
plt.thetagrids(angles * 180 / np.pi, labels) # 做标签
# plt.figtext(0.52,0.95,'雷达图',ha='center') #添加雷达图标题
plt.grid(True)
plt.show()
可视化结果如下:

源码链接: https://github.com/yhtbyr/AI-TRIPS/blob/main/RadarChart.py
