使用pyplot绘制ndarray双柱状图失败,报形状不匹配ValueError
解决双柱状图绘制时的Shape Mismatch问题
看起来你是想对比两组情感分类的分数(正/负/中性),但在绘制双柱状图时遇到了形状不匹配的错误。别担心,这个问题大多是因为数据维度没对齐,或者绘图时的参数设置不对,我来给你一步步解决。
错误原因分析
ValueError: shape mismatch通常发生在matplotlib尝试将不同形状的数据进行绘图时,常见诱因包括:
- 你的
y1或y2不是一维的ndarray(比如是(1,3)的二维数组) - 用于定位柱子的x轴数据和y轴数据长度不匹配
- 传入
plt.bar的参数格式不符合要求
完整可运行代码示例
下面是符合你需求的完整代码,我用模拟数据演示,你直接替换成自己的y1和y2就行:
import numpy as np import matplotlib.pyplot as plt # 模拟你的两个ndarray数据(替换成你自己的y1和y2) y1 = np.array([0.65, 0.2, 0.15]) # Positive, Negative, Neutral y2 = np.array([0.58, 0.27, 0.15]) # 先确认数据形状:应该都是(3,)的一维数组 print("y1形状:", y1.shape) print("y2形状:", y2.shape) # 如果数据是二维的(比如(1,3)),先转成一维 # y1 = y1.flatten() # y2 = y2.flatten() # 设置x轴的位置,一共3组分类 x = np.arange(3) # 柱子宽度,用来错开两组柱子避免重叠 width = 0.35 # 绘制双柱状图:通过x轴偏移实现并排显示 plt.bar(x - width/2, y1, width, label='Group 1') plt.bar(x + width/2, y2, width, label='Group 2') # 设置x轴刻度标签,对应三类情感 plt.xticks(x, ['Positive', 'Negative', 'Neutral']) # 添加图表装饰元素 plt.title('Comparison of Sentiment Scores') plt.ylabel('Scores') plt.legend() # 显示图形 plt.show()
关键细节说明
- 数据维度检查:运行代码前先打印
y1.shape和y2.shape,确保都是(3,)。如果是(1,3)或者(3,1),用flatten()或者reshape(-1)转成一维即可。 - 柱子错位技巧:用
x - width/2和x + width/2让两组柱子在同一分类下并排显示,避免重叠遮挡。 - 刻度对齐:
plt.xticks(x, ...)确保标签正好对应两组柱子的中间位置,视觉上更整齐。
快速排查小技巧
如果还是报错,你可以先打印各数据的长度,确保它们都是3个元素:
print(len(x), len(y1), len(y2)) # 正常应该输出3 3 3
内容的提问来源于stack exchange,提问作者T3J45




