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

16 r ggplot2

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

geom_histogram(aes(x=...), y="..ncount../sum(..ncount..)")
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

jor*_*ran 41

这里的混乱是一个长期存在的(由详细的警告信息证明),所有这些都是从一开始的stat_bin.

但是用户通常不会意识到他们的困惑是围绕着的stat_bin,因为他们在使用任何一个geom_bar或两个时都会遇到问题geom_histogram.请注意每个文档:它们都使用stat = "bin"(在当前的ggplot2版本中,此stat已被分为stat_bin连续数据和stat_count离散数据).

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

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

x
a
a
a
b
b
b
Run Code Online (Sandbox Code Playgroud)

或者相当于

x  y
a  3
b  3
Run Code Online (Sandbox Code Playgroud)

第一个还没有被分类.第二个是预先装箱.两者的默认行为geom_bar,并geom_histogram是假设你有没有预先分级数据.因此,他们会尝试在您的值上调用stat_bin(直方图,现在stat_count是条形图)x.

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

外卖这里是一个为geom_bar如果你已经预先计算的条的高度,始终记得用stat = "identity",或者更好的使用较新的geom_col,它使用stat = "identity"的默认值.因为geom_histogram你不太可能预先计算了这些垃圾箱,所以在大多数情况下你只需要记住不要映射y到超出返回范围的任何东西stat_bin.

geom_dotplot使用它自己的binning stat stat_bindot,我相信这个讨论也适用于此.这种情况通常不是2d分箱情况(geom_bin2dgeom_hex)的问题,因为在1d情况下类似z变量中的分类y变量没有那么多的灵活性.如果未来的更新开始允许更多花哨的操作2d binning案例,我想这可能成为你必须注意的东西.


mne*_*nel 8

对于文档geom_histogram的状态,这是一个别名stat_bingeom_bar

geom_density使用平滑密度估计的状态文档stat_density

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

stat_bin

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

计算 bin中的点数

bin中的点密度密度,按比例缩放为1

ncount count,缩放到最大值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..))
Run Code Online (Sandbox Code Playgroud)

  • 你能否解释一下这四个调用之间的区别:`geom_density(aes(x ='myvar'))`与`geom_density(aes(x ='myvar',y ='.. density ..'))``` geom_density(aes(x ='myvar',y ='.. scaled ..'))`与`geom_density(aes(x ='myvar',y ='.. count ../ sum(.. count .. )'))`?转移到不同的线程所以它不是凌乱的 (2认同)