R语言hist函数绘制直方图的异常问题咨询
为什么
hist(a, freq=FALSE)没有生成5个高度相同的柱子? 嘿,这个问题我之前帮别人排查过,核心是对hist()函数的分箱逻辑和freq=FALSE的含义理解有偏差,咱们一步步理清楚:
1. 先看默认分箱的问题
当你运行a <- c(1,2,3,4,5); hist(a, freq=FALSE)时,R并没有默认给每个数值单独分配一个箱子。它会用Sturges'公式自动计算分箱数,对于n=5的数据集,实际生成的默认分箱边界通常是[0, 2), [2, 4), [4, 6)这三个区间。
这样一来:
- 第一个区间包含1、2两个数值,频数是2
- 第二个区间包含3、4两个数值,频数是2
- 第三个区间包含5一个数值,频数是1
2. freq=FALSE对应的是概率密度,不是概率
这里最容易混淆的点:freq=FALSE时y轴显示的是概率密度,不是每个数值的概率。密度的计算公式是:密度 = (区间内数据比例) / 区间宽度
按默认分箱计算:
- 第一个区间:(2/5) / 2 = 0.2
- 第二个区间:(2/5) / 2 = 0.2
- 第三个区间:(1/5) / 2 = 0.1
所以你看到的柱子高度是0.2、0.2、0.1,自然不一样。而且所有柱子的面积加起来是1(0.22 + 0.22 + 0.1*2 = 1),这符合概率密度的要求。
3. 怎么得到5个高度相同的柱子?
要实现你的期望,需要手动指定分箱边界,让每个数值单独占一个宽度为1的区间。比如用breaks=seq(0.5, 5.5, 1):
a <- c(1,2,3,4,5) hist(a, freq = FALSE, breaks = seq(0.5, 5.5, 1))
这时候每个区间宽度是1,每个区间里只有1个数值,比例是1/5=0.2,密度就是0.2/1=0.2,所以5个柱子的高度完全相同,符合你的预期。
内容的提问来源于stack exchange,提问作者Daeyoon
相关产品推荐
相关产品推荐

