根据第一个面板在 ggplot2 中的多面板图中排序因素

Sorting factors in multipanel plot in ggplot2 according to the first panel

是否可以根据第一个面板对 ggplot2 中的多面板图中的因素进行排序?第一个面板决定顺序,其余面板按照该顺序。

这是一个例子:

require(ggplot2)
set.seed(36)
xx<-data.frame(YEAR=rep(c("X","Y"), each=20),
               CLONE=rep(c("A","B","C","D","E"), each=4, 2),
               TREAT=rep(c("T1","T2","T3","C"), 10),
               VALUE=sample(c(1:10), 40, replace=T))

ggplot(xx, aes(x=CLONE, y=VALUE, fill=YEAR)) + 
  geom_bar(stat="identity", position="dodge") +
  facet_wrap(~TREAT)

这给了我这个情节:

现在我想根据 YEAR X 中的 VALUE 以降序(从高到低)对 CLONE 进行排序,但仅针对对照(C控制板)。然后应为 T1T2T3 维护此顺序。通过查看上面的图,我希望面板 C 排序为 CLONE CBD(均为 5)、AE. CLONE 的顺序应复制到其余面板。

在 ggplot 中没有简单的方法可以正确执行此操作,因为您必须通过以下方式重新排序 CLONE 3 个条件,TREAT、YEAR 和 VALUE,否则 forcats::fct_reorder2 可能是一个选项。 而是从 YEAR = "X" 对应的数据子集中提取 CLONE 的顺序, TREAT = "C",并根据该子集重新定义整个数据集的因子水平。

library("ggplot2")
library("dplyr")
set.seed(36)

xx <- data.frame(YEAR = rep(c("X","Y"), each = 20),
           CLONE = rep(c("A","B","C","D","E"), each = 4, 2),
           TREAT = rep(c("T1","T2","T3","C"), 10),
           VALUE = sample(c(1:10), 40, replace = TRUE), stringsAsFactors = FALSE)

clone_order <- xx %>% subset(TREAT == "C"  & YEAR == "X") %>%
  arrange(-VALUE) %>% select(CLONE) %>% unlist()

xx <- xx %>% mutate(CLONE = factor(CLONE, levels = clone_order))

ggplot(xx, aes(x = CLONE, y = VALUE, fill = YEAR)) + 
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~TREAT)

给予