在 ggplot2 中按模态排序 facet_grid 或 facet_wrap 网格

order a facet_grid or facet_wrap grid by modality in ggplot2

我想同时在两个参数上订购我的 facet_plot 图。我看过 here and here 但我不明白如何同时处理我的两个轴 usees.type

library(ggplot2)

my.df <- data.frame(site = sample(c("place1","place2"), 20, replace = T), value = sample(1:10,20,replace = T), 
                    use = sample(c("medic","pharma","foodS","forage"), 5, replace = T), es.type = sample(c("plante","cereal","sol","sun"), 5, replace = T))

所以 my.df 可以像 :

     site value    use es.type
1  place2     5  medic     sol
2  place2     2 forage     sun
3  place2     2  medic  plante
4  place2     8 pharma  plante
5  place2     8  foodS  cereal
6  place1     9  medic     sol
7  place1     6 forage     sun
8  place2    10  medic  plante
9  place1     8 pharma  plante
10 place1    10  foodS  cereal
11 place1     7  medic     sol
12 place1     3 forage     sun
13 place1     5  medic  plante
14 place2     7 pharma  plante
15 place1     2  foodS  cereal
16 place1     9  medic     sol
17 place2     1 forage     sun
18 place1     2  medic  plante
19 place1     8 pharma  plante
20 place2     8  foodS  cereal    

我的剧情是

ggplot(data = my.df)+
  geom_bar(aes(x = site, y = value, fill = site), stat="identity")+
  facet_wrap(use~es.type)+
  theme(axis.text.x=element_blank(),
        axis.ticks.x=element_blank())

我想重新排序 facet 并首先获得最大组合。

您可以尝试使用交互,例如将两个变量粘贴在一起。

library(tidyverse)
# Calculate the maximum on both values
gr <- my.df %>% 
  mutate(group=paste(use, es.type, sep="\n")) %>%
  group_by(group) %>% 
  summarise(Max=sum(value)) %>% 
  arrange(-Max)

# Plot the data, but specifiying the order of the facets via
# the factor levels with respect to the order in `gr`.
my.df %>% 
  mutate(group=factor(paste(use, es.type, sep="\n"), levels=gr$group)) %>%
  ggplot()+
  geom_bar(aes(x = site, y = value, fill = site), stat="identity")+
  facet_wrap(~group)+
  theme(axis.text.x=element_blank(),
        axis.ticks.x=element_blank())

--

在 base R 中你可以在绘图之前做:

my.df$group <- paste(my.df$use, my.df$es.type, sep="\n")
gr <- aggregate(value ~ group, my.df, sum)
gr <- gr[order(gr$value, decreasing = T), ]
my.df$group <- factor(my.df$group, levels = gr$group)