指定breaks为单个数字时直方图区间数异常?两类直方图区间数差异原因?
hist()函数breaks参数的常见疑惑解答 这是个很容易踩坑的点,我来帮你把这两个问题讲明白:
问题1:当breaks指定为单个数字时,直方图区间数为何不符合预期?
其实你误解了breaks参数的作用——当你传入单个数字时,它不是强制要求生成这么多个区间,而是给函数一个「建议的区间数量」。
hist()函数内部会基于这个建议值,结合数据的分布,用算法(比如默认的Sturges公式,或者根据数据范围调整)来生成更“规整”的区间边界。比如它会尽量让区间边界是容易阅读的数值(比如整数、0.5的倍数),而不是生硬地把数据切成你指定的数量。这就导致最终的区间数可能和你输入的数字有偏差,像你例子里指定20,最终得到18个区间,就是因为函数调整了边界来让直方图更合理。
问题2:为什么两种breaks设置方式得到的区间数不同?
这两种方式本质上是完全不同的参数传递逻辑:
第一种:
breaks = 20
如上面所说,这是给函数一个区间数量的建议,函数会自动计算并调整区间边界,最终的区间数可能和建议值有差异。你可以运行下面的代码看看实际生成的边界:set.seed(42) x <- rnorm(10000) hist(x, breaks = 20, plot = FALSE)$breaks你会发现这个
breaks向量的长度是19,所以对应的区间数就是18个——这就是为什么counts的长度是18。第二种:
breaks = seq(min(x), max(x), length.out = 20+1)
这里你是手动指定了精确的区间边界:seq()生成了21个等距的点(因为length.out=20+1),相邻两个点之间就是一个区间,所以刚好是20个区间。hist()函数会严格使用你提供的这些边界,不会做任何调整,因此counts的长度就是20。
如果想要严格控制区间数量,最稳妥的方式就是手动生成breaks向量,而不是依赖单个数字的建议值。
内容的提问来源于stack exchange,提问作者user3825755

