簡體   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