ggplot2将变量映射到y并使用stat =“bin”时出错

时间:2013-03-27 02:44:42

标签: r ggplot2

我正在使用ggplot2制作直方图:

geom_histogram(aes(x=...), y="..ncount../sum(..ncount..)")

我收到错误:

Mapping a variable to y and also using stat="bin".
  With stat="bin", it will attempt to set the y value to the count of cases in each group.
  This can result in unexpected behavior and will not be allowed in a future version of ggplot2.
  If you want y to represent counts of cases, use stat="bin" and don't map a variable to y.
  If you want y to represent values in the data, use stat="identity".
  See ?geom_bar for examples. (Deprecated; last used in version 0.9.2)

一般来说是什么原因造成的?我对错误感到困惑,因为我没有将变量映射到y,只是直方图x,并希望直方图条的高度代表数据的标准化部分(这样所有的条形高度总和为100%的数据。)

编辑:如果我想制作密度图geom_density而不是geom_histogram,我可以使用..ncount../sum(..ncount..)还是..scaled..?我不清楚..scaled..做了什么。

2 个答案:

答案 0 :(得分:41)

这里的混淆是一个长期存在的问题(由详细的警告信息证明),所有这些都以stat_bin开头。

但是,用户通常不会意识到他们的混淆围绕stat_bin,因为他们在使用geom_bargeom_histogram时通常会遇到问题。请注意每个文档:它们都使用stat = "bin"(在当前 ggplot2 版本中,此统计信息已分为stat_bin表示连续数据,stat_count表示离散数据)默认情况下。

但是让我们回来吧。 geom_*控制数据的实际呈现为某种几何形式。 stat_*只是简单地转换您的数据。这种区别在实践中有点令人困惑,因为默认情况下,添加一层stat_bin会调用geom_bar,因此在您学习时它似乎与geom_bar无法区分。

无论如何,请考虑类似“条形”的geom:直方图和条形图。两者显然都会涉及到某些地方的数据分类。但我们的数据可以预先总结或不预先。例如,我们可能想要一个条形图:

x
a
a
a
b
b
b

或等同于

x  y
a  3
b  3

第一个尚未装箱。第二个是预先装箱。 geom_bargeom_histogram的默认行为是假设您已将预先分箱数据。因此,他们会尝试在您的stat_bin值上调用stat_count(对于直方图,现在为条形图x)。

如警告所示,它会尝试将y映射到最终的计数。如果您尝试将y自己映射到其他变量,则最终会出现在Here Here Be Dragons区域中。将y映射到stat_bin..count..等)返回的变量的函数应该没问题,不应该抛出警告(不适合我使用上面的@mnel示例)

这里的内容是geom_bar,如果您已经预先计算了条形图的高度,请务必使用stat = "identity",或者更好地使用较新的geom_col默认情况下使用stat = "identity"。对于geom_histogram,您不太可能预先计算出二进制数,因此在大多数情况下,您只需要记住不要将y映射到stat_bin以外的任何内容。

geom_dotplot使用它自己的分档统计信息stat_bindot,我相信此讨论也适用于此。对于二维分箱案例(geom_bin2dgeom_hex),这类事情通常不是问题,因为类似的z变量中没有那么多的灵活性可用于1d案例中的binned y变量。如果未来的更新开始允许对2d binning案例进行更多花哨的操作,我认为这可能会成为你必须注意的事情。

答案 1 :(得分:8)

geom_histogram的文档说明它是stat_bingeom_bar的别名

使用geom_density

生成的平滑密度估算的stat_density州的文档

点击链接(或直接找到帮助页面)

stat_bin

stat_bin的文档描述了stat_bin如何使用以下(附加)列返回data.frame

  

计数 bin中的点数

     

密度 bin中点的密度,缩放以集成到1

     

ncount 计数,缩放到最大值1

     

ndensity 密度,最大为1

stat_density

stat_density的文档描述了stat_density如何使用以下(附加)列返回data.frame

  

密度密度估算

     

计数密度*点数 - 对堆积密度图有用

     

缩放密度估算值,最大值为1


要以相同比例生成图表,您希望来自..ndensity..的{​​{1}}和来自stat_bin的{​​{1}}或..scaled..来自<{1}} p>

stat_density