为什么R hist和ggplot直方图输出如此不同?

eag*_*man 1 r histogram ggplot2

我得到了一些奇怪的结果,试图用ggplot绘制一个非常标准的随机变量的直方图.

RB = rbinom(10000000,100,.3)
qplot(RB)#histogram of the distrib with ggplot2. Assumes 30 buckets by default
dev.new()
hist(RB,breaks=30)#same with regular histogram
dev.new()
qplot(RB,binwidth=1)#if we force binwidth to 1 it seems to work
dev.new()
hist(RB,breaks=range(RB)[2]-range(RB)[1])
Run Code Online (Sandbox Code Playgroud)

第一次调用qplot的结果很奇怪.根据绘制数量,我们预计图表将显示平滑分布.

我使用ggplot2版本1.0.0和R 3.0.2

ton*_*nov 5

默认情况下,ggplot range/30根据提示使用binwidth.在你的情况下,它大约是48/30(取决于种子),大于1并且大约是1.5.

现在,你的数据不是连续的,你只得到整数,所以对于任何两个相邻的直方图箱,你会得到不规则性,这是因为第一个bin只包含一个可能的整数,而下一个bin将包含两个,所以上.结果,您会看到每隔一个箱子的计数大约翻倍.

说,你的数据看起来像

1 2 3 4 5 6
5 5 5 5 5 5
Run Code Online (Sandbox Code Playgroud)

如果你从0.5开始计算,你会得到这些箱子:

(0.5, 2] (2, 3.5] (3.5 5] (5, 6.5]
      10        5      10        5
Run Code Online (Sandbox Code Playgroud)

这正是你在第一块地块上看到的尖峰.

正如您已经发现的那样,如果binwidth严格为1,这将不会成为问题.

编辑:

正如@James指出的那样,使用以下内容重现ggplot给出的基本图形图片:

hist(RB, breaks=seq(min(RB), max(RB), length.out=30))
Run Code Online (Sandbox Code Playgroud)

它可能看起来有点不同,但尖峰就在那里.

  • 而对于 `hist` `breaks`: >> 在最后三种情况下,数字只是一个建议;断点将设置为漂亮的值。`hist(RB,breaks=seq(min(RB),max(RB),length.out=30))` 给出与 ggplot 相同的输出。 (2认同)