如何使用Python matplotlib创建堆叠条形图并解决shape mismatch报错
matplotlib堆叠条形图形状不匹配的解决方法
报错的核心原因
- 维度不匹配:代码中手动硬编码了
N=5,生成的x轴坐标序列ind = np.arange(N)包含5个元素,但实际从df1中提取的ZOB、KW两列的长度和5无法对齐。你贴出的原始数据源仅包含2条字典记录,就算转为DataFrame,这两列的序列长度也只有2,两边长度不一致,matplotlib无法将两个序列对齐到同一x轴,直接触发形状无法广播的报错。 - 堆叠逻辑缺失:就算维度对齐,当前代码里两次调用
plt.bar()都没有给第二个系列设置bottom参数,两个同位置的条形会完全重叠,根本达不到堆叠展示的效果。
修正后的可运行代码
import numpy as np import matplotlib.pyplot as plt import pandas as pd # 基于你提供的原始数据构建DataFrame data = [{'KW' : 1912927, 'ZOB': 873123}, {'KW' : 1912927, 'ZOB': 873123}] df1 = pd.DataFrame(data) # 自动匹配实际数据生成分组数,不要硬编码N的取值 N = len(df1) ZOB = df1['ZOB'] KW = df1['KW'] ind = np.arange(N) width = 0.35 # 绘制第一层ZOB对应条形 p1 = plt.bar(ind, ZOB, width) # 绘制第二层KW对应条形,通过bottom参数指定堆叠的起始高度为第一层的条形高度 p2 = plt.bar(ind, KW, width, bottom=ZOB) plt.ylabel('Wartość w zł') # 加图例区分两个数据系列 plt.legend((p1[0], p2[0]), ('ZOB', 'KW')) plt.show()
注意事项
如果你确实需要在x轴上展示5个分组,必须保证df1中的ZOB、KW列都有5个对应数值,不能用长度为2的序列去匹配长度为5的x轴坐标,否则依旧会触发形状不匹配的报错。
内容的提问来源于stack exchange,提问作者Przemek Dabek
相关产品推荐
相关产品推荐

