均匀分布的直方图未在R中正确绘制

atm*_*506 5 r

当我运行代码

hist(1:5)
Run Code Online (Sandbox Code Playgroud)

要么

hist(c(1,2,3,4,5))
Run Code Online (Sandbox Code Playgroud)

生成的直方图显示,当阵列中只有一个"1"时,第一个数字"1"的频率为2.

在此输入图像描述

我也试过了

hist(c(1,2,3,7,7,7,9))
Run Code Online (Sandbox Code Playgroud)

但它仍然显示第一个柱子比第二个柱子高两倍

在此输入图像描述

但是,当我跑

 hist(c(1:10))
Run Code Online (Sandbox Code Playgroud)

每个条的频率高度相等

我对统计数据和R很新,所以我不知道这背后的原因是什么.我希望有人可以帮我澄清为什么会这样.谢谢

在此输入图像描述

Sco*_*hie 12

以您的第一个例子为例,hist(1:5)您有五个数字,这些数字被放入四个箱子中.因此,这五个中的两个被归为一个.

直方图有在休息2,3,4,和5,这样你就可以合理地推断出的定义hist为,其中一些被绘制,是:

#pseudocode
if (i <= break) { # plot in bin }
Run Code Online (Sandbox Code Playgroud)

您可以手动指定中断来解决此问题:

hist(1:5, breaks=0:5)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


G. *_*eck 8

试试这个:

> trace("hist.default", quote(print(fuzzybreaks)), at = 25)
Tracing function "hist.default" in package "graphics"
[1] "hist.default"
>
> out <- hist(1:5)
Tracing hist.default(1:5) step 25 
[1] 0.9999999 2.0000001 3.0000001 4.0000001 5.0000001
> out$count
[1] 2 1 1 1
Run Code Online (Sandbox Code Playgroud)

它显示了fuzzybreaks它使用的实际值以及每个bin中的计数.显然,第一个箱子中有两个点(在0.9999999和之间2.0000001)和每个其他箱子中有一个点.

与之比较:

> out <- hist(1:5, breaks = 0:5 + 0.5)
Tracing hist.default(1:5, breaks = 0:5 + 0.5) step 25 
[1] 0.4999999 1.5000001 2.5000001 3.5000001 4.5000001 5.5000001
> out$count
[1] 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

现在每个箱子中都有一个点.


FvD*_*FvD 5

你看到的是,hist放入1:5四个箱子.所以会有一个有2个计数的垃圾箱.

如果您指定截止点,如下所示:

 hist(1:5, breaks=(c(0.5, 1.5, 2.5, 3.5, 4.5 , 5.5)))
Run Code Online (Sandbox Code Playgroud)

然后你会得到你期望的行为.