如何在Python中绘制堆叠图?附字典数据及形状不匹配报错
解决堆叠图绘制时的形状不匹配错误
给定以下4组字典数据:
Group_1= {60: 2, 65: 2} Group_2= {5: 2, 10: 2} Group_3= {7: 2, 64: 2} Group_4= {14: 2}
需要绘制堆叠图,要求:
- X轴为组编号(Group_1到Group_4)
- Y轴仅使用字典中的值,不显示键
但绘制时出现错误:
ValueError: shape mismatch: objects cannot be broadcast to a single shape.
错误原因
堆叠图要求每个X轴类别对应的Y值序列长度必须完全一致。前3组字典都包含2个值,而Group_4只有1个值,数据形状不匹配,导致无法完成堆叠计算。
解决方法
给数据量不足的组补全长度(比如补0,代表该组没有对应堆叠层),确保所有组的数值列表长度相同。以下是基于matplotlib的完整实现代码:
基础实现代码
import matplotlib.pyplot as plt # 原始数据 Group_1 = {60: 2, 65: 2} Group_2 = {5: 2, 10: 2} Group_3 = {7: 2, 64: 2} Group_4 = {14: 2} # 提取各组值,给Group_4补0以匹配其他组的长度 group_values = [ list(Group_1.values()), list(Group_2.values()), list(Group_3.values()), list(Group_4.values()) + [0] ] # X轴配置 x_labels = ["Group_1", "Group_2", "Group_3", "Group_4"] x = range(len(x_labels)) # 绘制两层堆叠图 plt.bar(x, [v[0] for v in group_values], label='堆叠层1') plt.bar(x, [v[1] for v in group_values], bottom=[v[0] for v in group_values], label='堆叠层2') # 图表配置 plt.xticks(x, x_labels) plt.ylabel('数值') plt.title('组数据堆叠图') plt.legend() plt.show()
通用批量处理代码(适配更多堆叠层)
如果后续堆叠层数量有变化,可自动补全所有组的数值长度:
import matplotlib.pyplot as plt # 原始数据 Group_1 = {60: 2, 65: 2} Group_2 = {5: 2, 10: 2} Group_3 = {7: 2, 64: 2} Group_4 = {14: 2} groups = [Group_1, Group_2, Group_3, Group_4] # 获取最大数值长度,作为统一标准 max_length = max(len(g.values()) for g in groups) # 批量补全所有组的数值列表 processed_values = [] for g in groups: vals = list(g.values()) processed_values.append(vals + [0]*(max_length - len(vals))) # X轴配置 x_labels = ["Group_1", "Group_2", "Group_3", "Group_4"] x = range(len(x_labels)) # 循环绘制所有堆叠层 bottom = [0]*len(x_labels) for layer_idx in range(max_length): layer_data = [v[layer_idx] for v in processed_values] plt.bar(x, layer_data, bottom=bottom, label=f'堆叠层{layer_idx+1}') # 更新下一层的底部基准值 bottom = [b + d for b, d in zip(bottom, layer_data)] # 图表配置 plt.xticks(x, x_labels) plt.ylabel('数值') plt.title('组数据堆叠图') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者pratik pradhan
相关产品推荐
相关产品推荐

