繁体   English   中英

是否可以使用单个 `geom_boxplot()` 将 ggplot 分组的部分箱线图分组,而没有分面?

[英]is it possible to ggplot grouped partial boxplots w/o facets w/ a single `geom_boxplot()`?

我需要在下图中添加一些部分箱线图:

library(tidyverse)

foo <- tibble(
  time = 1:100,
  group = sample(c("a", "b"), 100, replace = TRUE) %>% as.factor()
) %>% 
  group_by(group) %>% 
  mutate(value = rnorm(n()) + 10 * as.integer(group)) %>%
  ungroup()

foo %>%
  ggplot(aes(x = time, y = value, color = group)) + 
    geom_point() +
    geom_smooth(se = FALSE)

在此处输入图片说明

我会在上面的图中添加一个 (2 x 4 = 8) 箱线图(每组 4 个)的网格。 每个箱线图应考虑连续选择 25 个(或 n 个)点(在每组中)。 即,前两个箱线图表示第 1 个和第 25 个之间的点(a 组下方的一个箱线图,b 组上方的一个箱线图)。 在它们旁边,还有另外两个箱线图,用于第 26 和第 50 点之间的点,等等。 如果它们不是在一个完美的网格中(我认为这会更难获得并且更丑),那就更好了:我更喜欢它们是否会“遵循”相应的平滑线!

这一切都没有使用刻面(因为我必须将它们插入到已经刻面的图中:-))

我试过了

bar <- foo %>%
  group_by(group) %>%
  mutate(cut = 12.5 * (time %/% 25)) %>%
  ungroup()

bar %>%
  ggplot(aes(x = time, y = value, color = group)) + 
    geom_point() +
    geom_smooth(se = FALSE) + 
    geom_boxplot(aes(x = cut))

但它不起作用。

在此处输入图片说明

我尝试使用group而不是x调用geom_boxplot()

bar %>%
  ggplot(aes(x = time, y = value, color = group)) + 
    geom_point() +
    geom_smooth(se = FALSE) + 
    geom_boxplot(aes(group = cut))

但它在不考虑组的情况下绘制箱线图甚至丢失颜色(并添加包括color = group的冗余调用无济于事)

在此处输入图片说明

最后,我决定粗略地尝试一下:

bar %>%   
  ggplot(aes(x = time, y = value, color = group)) + 
  geom_point() +
  geom_smooth(se = FALSE) +
  geom_boxplot(data = filter(bar, group == "a"), aes(group = cut)) +
  geom_boxplot(data = filter(bar, group == "b"), aes(group = cut))

它有效(甚至从主aes保持正确的颜色)! 在此处输入图片说明

有人知道是否可以通过一次调用geom_boxplot()来获得它?

谢谢!

这很有趣! 我之前没有尝试使用带有连续x geom_boxplot并且不知道它的表现如何。 我认为正在发生的事情是设置group覆盖geom_boxplot colour ,因此它不尊重继承或重复的colour美学。 我认为这种解决方法可以解决问题; 我们将groupcut变量组合到group_cut ,它采用 8 个不同的值(每个所需的箱线图一个)。 现在我们可以映射aes(group = group_cut)并获得所需的输出。 我不认为这是特别直观的,它可能值得在 Github 上提出,因为通常我们期望美学能够很好地结合(例如,结合colourlinetype效果很好)。

library(tidyverse)

bar <- tibble(
  time = 1:100,
  group = sample(c("a", "b"), 100, replace = TRUE) %>% as.factor()
) %>% 
  group_by(group) %>% 
  mutate(
    value = rnorm(n()) + 10 * as.integer(group),
    cut = 12.5 * ((time - 1)  %/% 25), # modified this to prevent an extra boxplot
    group_cut = str_c(group, cut)
  ) %>%
  ungroup()

bar %>%
  ggplot(aes(x = time, y  = value, colour = group)) +
  geom_point() +
  geom_smooth(se = FALSE) +
  geom_boxplot(aes(group = group_cut), position = "identity")
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'

reprex 包(v0.3.0) 于 2019 年 8 月 13 日创建

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM