You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:36:17