ggplot stat_summary_bin故障?

时间:2016-09-04 19:29:14

标签: r ggplot2 binning

我很高兴discover ggplot具有分箱散点图,这对于探索和可视化大数据中的关系非常有用。然而,顶级垃圾箱似乎行为不端。这是一个例子:所有的bin平均值大致是线性对齐的,因为它们应该是,但最重要的是在两个维度上都是关闭的:

enter image description here

代码:

library(ggplot2)

# simulate an example of linear data 
set.seed(1)
N <- 10^4
x <- runif(N)
y <- x + rnorm(N)
dt <- data.frame(x=x, y=y)

ggplot(dt, aes(x, y)) + 
  geom_point(alpha = 0.1, size = 0.01) +
  stat_summary_bin(fun.y='mean', bins=10, color='orange', size=5, geom='point')

是否有一个简单的解决方法(应该在哪里发布)?

2 个答案:

答案 0 :(得分:3)

stat_summary_bin实际上是排除了来自二进制位的x值最大的两行,这两个值最终以bin = NA结尾。将这两个排除值的平均值绘制为常规箱右侧的单独箱。首先,我展示了原始情节中出现的问题然后我提供了一种解决方法来获得所需的行为。

原始情节

出了什么问题

要查看原始绘图中出现的问题,请创建一个带有两次stat_summary_bin调用的绘图,其中我们计算每个bin的平均值和每个bin中的值的数量。然后使用ggplot_build捕获ggplot生成的所有内部数据以创建绘图。

p1 = ggplot(dt, aes(x, y)) + 
  geom_point(alpha = 0.1, size = 0.01) +
  stat_summary_bin(fun.y=mean, bins=10, size=5, geom='text',
                   aes(label=..y..)) +
  stat_summary_bin(fun.y=length, bins=10, size=5, geom='text',
                   aes(label=..y.., y=0)) 

p1b = ggplot_build(p1)

现在让我们分别查看meanlength图层的数据。为简洁起见,我只打印了9到11个箱子(三个最右边的箱子)。 Bin 11是&#34; extra&#34; bin,您可以看到它只包含2个值(下面第二个表中label2),并且这两个值的平均值为-0.1309998,可以看出在下面的第一个表格中。

p1b$data[[2]][9:11,c(1,2,4,6,7)]
        label bin          y         x      width
9   0.8158320   9  0.8158320 0.8498505 0.09998242
10  0.9235531  10  0.9235531 0.9498329 0.09998242
11 -0.1309998  11 -0.1309998 1.0498154 0.09998244
p1b$data[[3]][9:11,c(1,2,4,6,7)]
   label bin    y         x      width
9   1025   9 1025 0.8498505 0.09998242
10  1042  10 1042 0.9498329 0.09998242
11     2  11    2 1.0498154 0.09998244

那两个值是哪两个?看起来它们来自原始数据框中具有最高x值的两行:

mean(dt[order(-dt$x), "y"][1:2]) 
[1] -0.1309998

我不确定stat_summary_bin如何管理数据,以便排除两个最高的x值。

解决方法以获得所需的行为

解决方法是自己总结数据,这样您就可以完全控制垃圾箱的创建方式。下面的示例使用您的原始代码,然后以蓝色绘制预先汇总的值,以便您可以比较行为。我已经包含了dplyr包,以便我可以使用链接运算符(%>%)来动态汇总数据:

library(dplyr)

ggplot(dt, aes(x, y)) + 
  geom_point(alpha = 0.1, size = 0.01) +
  stat_summary_bin(fun.y='mean', bins=10, color='orange', size=5, geom='point') +
  geom_point(data=dt %>% 
               group_by(bins=cut(x,breaks=seq(min(x),max(x),length.out=11), include.lowest=TRUE)) %>%
               summarise(x=mean(x), y=mean(y)),
             aes(x,y), size=3, color="blue") +
  theme_bw()

enter image description here

答案 1 :(得分:1)

@ eipi10 has already explained,为什么会这样。

也许最简单的解决方案是为你的情节添加一个限制scale_x_continuous,以便从图中排除额外的“NA”区域。

ggplot(dt, aes(x, y)) + 
  geom_point(alpha = 0.1, size = 0.01) +
  stat_summary_bin(fun.y='mean', bins=10, color='orange', size=5, geom='point') +
  scale_x_continuous(limits = range(x))

enter image description here

这对于大数据是可以接受的,例如在示例中,从数据库中排除的少量数据点不会显着偏向统计数据。但是,如果处理从摘要统计中丢失一些数据点很重要的情况,那么@ eipi提供的解决方案会更好。