16

我正在使用 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..)or..scaled..吗?我不清楚是做什么..scaled..的。

4

2 回答 2

41

这里的混淆是一个长期存在的混淆(如冗长的警告消息所证明的那样),一切都以stat_bin.

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

但是,让我们备份。geom_*' 控制将数据实际呈现为某种几何形式。stat_*只是转换您的数据。这种区别在实践中有点令人困惑,因为添加一层stat_bin将默认调用,因此它看起来与您学习时geom_bar没有区别。geom_bar

无论如何,请考虑类似“条形”的几何图形:直方图和条形图。两者显然都将涉及沿线某处的一些数据分箱。但我们的数据可以是预先汇总的,也可以不是。例如,我们可能想要一个条形图:

x
a
a
a
b
b
b

或等效地来自

x  y
a  3
b  3

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

正如警告所说,它将尝试y为您映射到结果计数。如果您尝试将y自己映射到其他变量,您最终会进入 Here There Be Dragons 领域。映射ystat_bin(..count..等) 返回的变量的函数应该没问题,并且不应该抛出该警告(它不适用于我上面使用@mnel 的示例)。

这里的要点是,geom_bar如果您已经预先计算了条形的高度,请始终记住使用stat = "identity",或者最好使用默认使用的较新geom_colstat = "identity"。因为geom_histogram您不太可能预先计算 bin,所以在大多数情况下,您只需要记住不要映射y到从stat_bin.

geom_dotplot使用它自己的分箱统计stat_bindot,我相信这个讨论也适用于这里。这类事情对于 2d 分箱情况 (geom_bin2d和) 通常不是问题,因为在 1d 情况下,与分箱变量geom_hex类似的变量没有那么多的灵活性。如果未来的更新开始允许对 2d 分箱案例进行更多花哨的操作,我想这可能会成为您必须注意的事情。zy

于 2013-03-27T03:43:08.280 回答
8

的文档geom_histogram声明它是stat_bin和的别名geom_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..来自stat_bin..scaled..来自stat_density..density..来自两者

ggplot(dd, aes(x=x)) + 
  geom_histogram(aes(y= ..density..)) +  
  geom_density(aes(y=..density..))


ggplot(dd, aes(x=x)) + 
  geom_histogram(aes(y= ..ndensity..)) + 
  geom_density(aes(y=..scaled..))
于 2013-03-27T03:43:53.713 回答