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

Matplotlib直方图存在数值缺失:是使用失误还是特性/Bug?

这不是Matplotlib的Bug,是离散数据与直方图分箱逻辑的对齐问题

首先得明确:你的数据是严格离散的——所有values里的元素都是[0.1, 0.2, ..., 0.9]这9个固定值(因为bins[0]=0对应的概率是0,不会被选中),而Matplotlib的hist()函数默认是为连续数据设计的,这就是问题的根源。

为什么会出现“数值缺失”?

当你调用plt.hist(values, 10)时,Matplotlib会自动计算分箱规则:从数据的最小值(0.1)到最大值(0.9),均匀分成10个等宽区间。计算一下区间宽度:(0.9-0.1)/10 = 0.08,所以分箱区间是:
[0.1, 0.18), [0.18, 0.26), [0.26, 0.34), ..., [0.82, 0.9]

你的离散值比如0.1落在第一个区间,0.2落在第二个,但0.9刚好卡在最后一个区间的右边界,而中间会出现没有数据的空区间(比如某个区间刚好没有对应的离散值落入),反映在直方图上就是某个位置没有条形,看起来像是“数值缺失”——这完全是分箱区间和你的离散值不匹配导致的,不是Bug。

为什么用更多bins(20/100)看起来“合理”但有空白?

当你把bins数量设为20或100时,分箱宽度会变得很窄,每个离散值会被单独分到一个区间里,比如20个bins时,区间宽度是0.04,0.1会落在[0.1, 0.14),而下一个区间[0.14, 0.18)没有数据,所以会出现空白。但因为分箱足够细,每个离散值对应的条形很窄,整体看起来更接近离散分布的形态,但本质还是因为离散数据没有中间值,导致空区间存在。

正确的解决方法:手动指定匹配离散值的分箱区间

既然你的数据是间隔0.1的离散值,最准确的做法是手动定义分箱边界,让每个离散值刚好落在对应箱的中间(或者边界),避免空区间。比如:

# 定义分箱边界:每个离散值左右各扩展0.05,确保每个值单独占一个箱
custom_bins = np.arange(-0.05, 1.0, 0.1)
plt.hist(values, bins=custom_bins)
plt.show()

这样每个箱的范围是[-0.05,0.05), [0.05,0.15), ..., [0.85,0.95),你的每个离散值都会刚好落在对应箱的中心,直方图会完美匹配你的离散概率分布,既没有“数值缺失”,也不会出现多余的空白。

另外,如果你坚持要用bins=N的形式,也可以结合align参数调整,但手动指定bins是最可靠的方式。

内容的提问来源于stack exchange,提问作者Rho Phi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:03:09