如何计算Matplotlib/Plotly中雷达图的数据集多边形面积?
计算雷达图多边形面积作为总分的实现方法
雷达图的多边形面积可通过分解为多个三角形求和的方式计算:将多边形拆成以原点为顶点、相邻特征轴为边的三角形,每个三角形面积用公式 (1/2)*r_i*r_{i+1}*sin(θ) 计算(θ是相邻轴的夹角,即 2π/n,n为特征数量),最后求和得到总面积,以此作为数据集的「总分」。
Matplotlib 实现步骤及代码
- 准备数据集:确保数据首尾闭合(最后一个元素等于第一个,形成完整多边形)
- 计算特征轴的均匀夹角
- 代入公式求和计算总面积
import numpy as np # 示例数据集:对应4个特征,首尾闭合 data_set = [4, 3, 5, 2, 4] n_features = len(data_set) - 1 # 去除重复的首尾元素,得到特征数量 angle_step = 2 * np.pi / n_features # 相邻特征轴的夹角(弧度) # 计算总面积 total_area = 0.5 * np.sum(data_set[:-1] * data_set[1:] * np.sin(angle_step)) print(f"数据集的雷达图面积得分:{total_area:.2f}")
Plotly 实现步骤及代码
Plotly的雷达图数据存储在figure.data的每个trace中,提取r值后用同样的公式计算:
import numpy as np import plotly.graph_objects as go # 创建示例雷达图 fig = go.Figure() # 添加两个数据集的雷达图轨迹 fig.add_trace(go.Scatterpolar( r=[4, 3, 5, 2, 4], theta=['特征1', '特征2', '特征3', '特征4', '特征1'], fill='toself', name='对象A' )) fig.add_trace(go.Scatterpolar( r=[3, 5, 2, 4, 3], theta=['特征1', '特征2', '特征3', '特征4', '特征1'], fill='toself', name='对象B' )) fig.update_layout(polar=dict(radialaxis=dict(visible=True))) # 遍历每个轨迹计算面积得分 for trace in fig.data: r_values = np.array(trace.r) n_features = len(r_values) - 1 angle_step = 2 * np.pi / n_features area = 0.5 * np.sum(r_values[:-1] * r_values[1:] * np.sin(angle_step)) print(f"{trace.name}的雷达图面积得分:{area:.2f}")
注意事项
- 若原始数据未首尾闭合,需手动将第一个元素添加到列表末尾,确保形成完整多边形
- 公式中的角度必须用弧度计算,numpy的
sin函数默认使用弧度 - 面积得分的大小与特征数量、数据取值范围正相关,若需跨不同特征数量的数据集比较,可考虑对面积做归一化处理
内容的提问来源于stack exchange,提问作者jredd
相关产品推荐
相关产品推荐

