【问题标题】:Why are R hist and ggplot histograms output so different?为什么 R hist 和 ggplot 直方图输出如此不同?
【发布时间】:2014-08-29 10:06:27
【问题描述】:

我在尝试用 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

【问题讨论】:

标签: r ggplot2 histogram


【解决方案1】:

默认情况下,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))

它可能看起来有点不同,但尖峰是存在的。

【讨论】:

  • 对于hist breaks: >> 在最后三种情况下,数字只是一个建议;断点将设置为漂亮的值。 hist(RB,breaks=seq(min(RB),max(RB),length.out=30)) 提供与 ggplot 相同的输出。
  • @James 好点,但对于我的种子来说,这些仍然略有不同。无论如何,尖峰出现了。介意我将此注释添加到答案中吗?
  • 请做。我想我在length.out 上犯了一个错误——30 个箱子应该是 31。
  • 即使 length.out= 31 也存在基本 R hist() 和 ggplot geom_histogram 输出的差异。
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 2017-10-17
  • 2018-12-16
  • 1970-01-01
相关资源
最近更新 更多