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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:34:38