R Hist:'breaks' 值与 bin 数量/大小之间的关系

MME*_*MEL 4 r histogram

关于 R/ 中的 HIST/hist() 函数,谁能帮我找到:

一个非常简单的定义解释了“breaks”的指定值与直方图中产生的 bin 数量之间的关系?

例如,我使用 R 工具提供的基本数据集:

data(mtcars)
hist(mtcars$mpg, break=3) --> will draw 3 bins (really??? weird!)
hist(mtcars$mpg, break=4) --> will draw 5 bins 
hist(mtcars$mpg, break=5) --> will draw 5 bins no change, same as breaks=4
hist(mtcars$mpg, break=6) --> will draw 5 bins no change, same as breaks=4
hist(mtcars$mpg, break=7) --> will draw 5 bins no change, same as breaks=4
hist(mtcars$mpg, break=8) --> will draw 5 bins no change, same as breaks=4
hist(mtcars$mpg, break=9) --> will draw 11 bins (why???)
Run Code Online (Sandbox Code Playgroud)

为什么breaks = 4,5,6,7,8 会导致相同数量的bins 而breaks=3 只导致4 个bins,...?

您可以在 ?hist 或以下链接中找到 R 文档: http://localhost//library/graphics/html/hist.html

并没有真正的帮助,我试图在“breaks=”中指定的值、bin 的大小和 bin 的数量之间建立任何联系,但我找不到一个简单或简单的公式或解释来扣除这种“链接”。

我只是不明白“breaks=3”是什么意思?它的意思是“3 次休息”还是“每隔 3 个单位休息一次”或完全不同的意思?

我真的很感激任何提示、帮助、任何类型的指针。

谢谢你。

G5W*_*G5W 5

的文档hist说,当您将中断指定为单个数字(如您所做的那样)时

号码仅供参考;因为断点将设置为漂亮的值

如果您按照指向文档的链接进行操作,pretty 它会说

选择这些值是为了使它们是 10 的幂的 1、2 或 5 倍。

您不能以 1,2、5 或 10 的 4 个均匀间隔的倍数跨越 10 和 35 之间的间隙,因此它选择了 5 个 bin(6 个断点)。如果你真的想要四个均匀间隔的垃圾箱,你可以使用

hist(mtcars$mpg, seq(10,35, length.out=5))
Run Code Online (Sandbox Code Playgroud)

具有 4 个 bin 的直方图

请注意,您需要使用 length.out=5 来获得四个 bin(四个起点加上一个额外的端点)。当然,这并没有给出“漂亮”的价值。

如果您不喜欢 x 轴上的刻度与垃圾箱不对齐(我不喜欢),您可以将轴留在里面hist并自己添加它们。

H = hist(mtcars$mpg, seq(10,35, length.out=5), axes=FALSE, ylim=c(0,14))
axis(side=1, at=seq(10,35, length.out=5))
axis(side=2, pretty(0:14))
Run Code Online (Sandbox Code Playgroud)

直方图 2

进一步说明 breaks

文档?hist说在中断下有 5 种类型的值可用于中断。您正在使用的是:

给出直方图单元格数量的单个数字

但是如上所述,文档补充说:

号码仅供参考;断点将设置为漂亮的值。

所以当你给出hist参数时breaks=4,它知道你想要4 个 bin,但它也会坚持使用“漂亮”的边界值,即均匀间隔的 1,2 的倍数,10 的幂的 5 倍。端点上也可能存在限制。

让我们研究一下它对您的 mtcars$mpg 数据的作用。hist通过保存返回值,您可以获得大量有关正在执行的操作的信息。我还将抑制直方图的实际绘制,因为现在我只对值感兴趣。

HV = hist(mtcars$mpg, 4, plot=FALSE)
Run Code Online (Sandbox Code Playgroud)

可以打印出HV,看到有很多关于直方图的信息。我们在这里关心的所有内容都存储在breaks.

HV$breaks
[1] 10 15 20 25 30 35
Run Code Online (Sandbox Code Playgroud)

这给出了 bin 的 6 个边界值(5 个 bin 需要 6 个边界值)。但是我们要了 4 个垃圾箱,而不是 5 个!如果将范围 10-35 分成四个区间,则会得到边界 10、16.25、22.5、28.75 和 35。这些不是“漂亮”的边界值。相反,hist使用该pretty函数为边界找到更好的值,但这意味着它必须放弃使用 4 个 bin。

对于一系列中断值,我们会得到多少个中断点?让我们尝试 2 次休息,最多 20 次休息。

sapply(2:20, function(n) 
    length(hist(mtcars$mpg, n, plot=FALSE)$breaks))
 [1]  4  4  6  6  6  6  6 13 13 13 13 13 13 13 13 25 25 25 25
Run Code Online (Sandbox Code Playgroud)

再次注意:4 个断点意味着 3 个 bin。6 个断点意味着 5 个 bin。只创建了四个不同的拆分。这些是什么?

unique(lapply(2:20, function(n) hist(mtcars$mpg, n, plot=FALSE)$breaks))
[[1]]
[1] 10 20 30 40
[[2]]
[1] 10 15 20 25 30 35
[[3]]
 [1] 10 12 14 16 18 20 22 24 26 28 30 32 34
[[4]]
 [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
Run Code Online (Sandbox Code Playgroud)

边界变化 10、5 2 或 1 - 漂亮的边界。

如果你想有更多的控制,你需要能够指定你想要的边界。这就是我在上面的例子中所做的。用于指定的其他选项之一breaks是:

给出直方图单元格之间断点的向量

这就是我在指定seq(10,35, length.out=5). 但请注意以下值:

seq(10,35, length.out=5)
[1] 10.00 16.25 22.50 28.75 35.00
Run Code Online (Sandbox Code Playgroud)

不漂亮。

所以你可以让它变得简单而漂亮,但不能很好地控制垃圾箱的数量,或者你可以以更多的工作和更丑陋的边界为代价来控制垃圾箱的数量。