【问题标题】:ggplot stat_summary_bin glitch?ggplot stat_summary_bin 故障?
【发布时间】:2016-09-04 19:29:13
【问题描述】:

我很高兴discover ggplot 已合并散点图,这对于探索和可视化大数据中的关系很有用。然而,顶部的垃圾箱似乎行为不端。下面是一个示例:所有 bin 平均值大致呈线性对齐,应该是这样,但顶部的两个维度上都关闭了:

代码:

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')

有没有简单的解决方法(应该在哪里发布)?

【问题讨论】:

  • 我同意分箱发生了一些不直观的事情(但坦率地说,分箱算法在某种程度上几乎总是不直观)。您可能可以通过传递 origin = -0.01 来解决它(即,在您的最小 x 值之前的某个值)。我不得不花很多时间研究分箱功能来准确追踪正在发生的事情。也许更熟悉内部的人可以用更少的研究发表评论。
  • ...origin = -0.05 看起来“最好”的事实让我怀疑分箱与轴扩展因子发生了某种冲突。

标签: r ggplot2 binning


【解决方案1】:

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

原剧情出了什么问题

要查看原始图中出了什么问题,请创建一个带有两次调用 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 是“额外”的 bin,你可以看到它只包含 2 个值(它的 label 在下面的第二个表中是 2),并且这两个值的平均值是 -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 值。

获得所需行为的解决方法

一种解决方法是您自己汇总数据,这样您就可以完全控制 bin 的创建方式。下面的示例使用您的原始代码,然后将预先汇总的值绘制为蓝色,以便您比较行为。我已经包含了 dplyr 包,这样我就可以使用链接运算符 (%&gt;%) 即时汇总数据:

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()

【讨论】:

    【解决方案2】:

    @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))
    

    这对于大数据应该是可以接受的,例如在示例中,从 bin 中排除的少量数据点不会显着影响统计数据。但是,如果处理从汇总统计中丢失几个数据点的情况很重要,那么@eipi 提供的解决方案会更好。

    【讨论】:

      猜你喜欢
      • 2019-10-08
      • 2016-09-09
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多