如何解释不同的ggplot2密度图?

23

我对ggplot中以下这些“geom_density”的变体的含义感到困惑:

请问有人能够解释一下这四个调用之间的区别吗:

  1. geom_density(aes_string(x=myvar))
  2. geom_density(aes_string(x=myvar, y=..density..))
  3. geom_density(aes_string(x=myvar, y=..scaled..))
  4. geom_density(aes_string(x=myvar, y=..count../sum(..count..)))

我的理解是:

  • 只使用 geom_density 会生成一个曲线下面积为1的概率密度函数。
  • 使用 geom_density 和参数 ..density.. 基本上也是这样...?
  • 使用参数 ..count../sum(..count..) 将规格化峰值的高度,使其更像规格化的直方图,确保所有的高度总和为1。
  • 仅使用 ..count.. 而没有分母将每个条柱乘以其中的项目数量。
  • 使用 ..scaled.. 参数将使得密度的最大值是1。

我觉得 ..scaled.. 很反直觉,并且从未见过它被使用,如果我的解释是正确的话,我想忽略它。我主要是想澄清 geom_density 和规格化密度图之间的差异,我认为需要使用 ...count../... 参数。谢谢。

(相关链接:ggplot2将变量映射到y并使用stat="bin"出错


3
无关的提示:你真的需要停止在aes()内引用变量。除非你正在使用aes_string,否则不应该这样做。 - joran
@joran:我正在使用aes_string,抱歉,我正在使用rpy2所以它总是aes_string - user248237
2
仅供读者参考。问题已编辑以解决aesaes_string的疑虑。这个错误并不是问题的核心。 - CoderGuy123
1个回答

13
stat_density 的默认美学是 ..density..,所以调用 geom_density 默认使用 stat_density,将默认绘制 y = ..density..
您可以通过查看源代码了解如何计算各列。 ..scaled.. 被定义为:
densdf$scaled <- densdf$y / max(densdf$y, na.rm = TRUE)

如果您愿意,可以忽略它。

查看stat_bin的源代码

结果计算如下

res <- within(results, {
    count[is.na(count)] <- 0
    density <- count / width / sum(abs(count), na.rm=TRUE)
    ncount <- count / max(abs(count), na.rm=TRUE)
    ndensity <- density / max(abs(density), na.rm=TRUE)
  })

因此,如果您想比较geom_histogram(使用默认的stat = 'bin')的结果,则可以设置y=..density..,它将为您计算count / sum(count)(考虑到箱子的宽度)。

如果您想将geom_density(aes(y=..scaled..))stat_bin进行比较,则应使用geom_histogram(aes(y=..ndensity..))

您还可以在两者中使用..count..来使它们处于相同的比例,但是需要调整stat_density中的adjust参数以获得适当详细的曲线近似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接