如何绘制双标签雷达图?解决ValueError解包过多值问题
解决雷达图多组标签的ValueError问题及实现方案
错误原因分析
ValueError: too many values to unpack (expected 2) 是因为你的example_data返回的数据结构和代码中的拆包逻辑不匹配:如果函数返回的是扁平列表(比如[labels1, data1, labels2, data2]),但你尝试用group1, group2 = example_data()拆成两个变量,就会因列表长度(4)和预期拆包数量(2)不匹配触发错误。
调整数据结构
修改example_data,让它返回包含两个元组的列表,每个元组对应一组(标签列表、数据数组),确保每组数据的结构统一:
def example_data(): # 第一组:运动属性 labels_sport = ['速度', '力量', '耐力', '敏捷', '精准'] data_sport = [85, 90, 75, 80, 95] # 第二组:游戏角色属性 labels_game = ['攻击力', '防御力', '续航力', '爆发力', '容错率'] data_game = [70, 85, 90, 75, 80] # 返回两组(标签, 数据)的元组列表 return [(labels_sport, data_sport), (labels_game, data_game)]
双雷达图实现代码
通过创建两个极坐标子轴,分别传入对应组的标签和数据绘制:
import matplotlib.pyplot as plt import numpy as np def draw_radar(ax, spoke_labels, data, plot_title): num_items = len(spoke_labels) # 计算每个标签对应的极坐标角度 angles = np.linspace(0, 2 * np.pi, num_items, endpoint=False).tolist() # 闭合雷达图(首尾数据/角度重复) data_closed = data + data[:1] angles_closed = angles + angles[:1] labels_closed = spoke_labels + spoke_labels[:1] # 绘制雷达线和填充区域 ax.plot(angles_closed, data_closed, 'o-', linewidth=2) ax.fill(angles_closed, data_closed, alpha=0.2) # 设置径向刻度范围(根据你的数据调整) ax.set_ylim(0, 100) # 设置极轴标签 ax.set_xticks(angles_closed[:-1]) ax.set_xticklabels(labels_closed[:-1]) # 设置子图标题 ax.set_title(plot_title, y=1.1) # 获取整理后的数据 data_groups = example_data() # 创建1行2列的极坐标子图 fig, (ax_left, ax_right) = plt.subplots(1, 2, figsize=(12, 6), subplot_kw={'projection': 'polar'}) # 分别绘制两组雷达图 draw_radar(ax_left, data_groups[0][0], data_groups[0][1], '运动能力属性') draw_radar(ax_right, data_groups[1][0], data_groups[1][1], '游戏角色属性') plt.tight_layout() plt.show()
关键说明
- 每个子轴独立设置
spoke_labels,通过set_xticklabels绑定对应组的标签 - 雷达图需要闭合,所以要把数据、角度、标签的首尾元素重复一次
- 数据结构调整后,通过索引
data_groups[0]/data_groups[1]即可获取每组的标签和数据,避免拆包错误
内容的提问来源于stack exchange,提问作者Ahmed Attia
相关产品推荐
相关产品推荐

