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

时间:2014-08-29 10:06:27

标签: r ggplot2 histogram

我得到了一些奇怪的结果,试图用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])

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

我使用ggplot2版本1.0.0和R 3.0.2

1 个答案:

答案 0 :(得分:5)

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

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

说,您的数据看起来像

1 2 3 4 5 6
5 5 5 5 5 5

如果你从0.5开始计算,你将获得这些垃圾箱:

(0.5, 2] (2, 3.5] (3.5 5] (5, 6.5]
      10        5      10        5

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

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

编辑:

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

hist(RB, breaks=seq(min(RB), max(RB), length.out=30))

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