Matplotlib直方图未生成指定数量分箱的问题排查
问题:指定分箱数绘制直方图不生效
我有一组光谱数据,x代表波长,y对应该波长下的强度值。尝试绘制特定波长(338.05 nm)下强度的分布直方图,过滤后的数据如下:
y0 y1 y2 ... y47 y48 y49 675 0.005513 0.007296 0.00572 ... -0.000084 -0.004105 -0.001181
使用以下代码绘制直方图,明确指定bins=5:
plt.hist(wavelength_338.iloc[[2], :-1], bins = 5, ec= 'skyblue') plt.xlabel("Δy (y̅ -y)") plt.ylabel("Count") plt.title("Δy Distribution for 338.05 nm") plt.show()
原本计划用Freedman-Diaconis规则计算分箱数,但实际生成的直方图分箱数远多于5个,无法定位原因。
问题原因
核心问题是数据维度错误:wavelength_338.iloc[[2], :-1]返回的是二维DataFrame(行索引为[2],列是y0到y48)。plt.hist处理二维数据时,会将每一列视为独立的数据集,分别绘制5个分箱的直方图,49组直方图叠加后,视觉上分箱数远多于指定的5个。
解决办法
将二维数据转换为一维数组,让plt.hist把所有y值当作一组数据处理,两种可行方式:
- 方法1:用
.values.flatten()扁平化数组
plt.hist(wavelength_338.iloc[2, :-1].values.flatten(), bins=5, ec='skyblue') plt.xlabel("Δy (y̅ -y)") plt.ylabel("Count") plt.title("Δy Distribution for 338.05 nm") plt.show()
- 方法2:用
.squeeze()压缩冗余维度
plt.hist(wavelength_338.iloc[[2], :-1].squeeze(), bins=5, ec='skyblue') plt.xlabel("Δy (y̅ -y)") plt.ylabel("Count") plt.title("Δy Distribution for 338.05 nm") plt.show()
内容的提问来源于stack exchange,提问作者bigmac42
相关产品推荐
相关产品推荐

