首页 > 解决方案 > 根据ggplot2中的第一个方面对堆叠条进行排序

问题描述

我正在做堆积条形图,我有一个代码根据第一个变量“TERP”的百分比对条形进行排序。当我处理这个情节时,条形的顺序会根据每个方面的“TERP”重新排序,但是我希望条形在每个方面具有相同的顺序。因此,只有第一个方面才会根据“TERP”的百分比对条进行排序。在第一个方面,条形的顺序应该是 4、1、3、2,在第二个方面也是如此。

任何关于如何做到这一点的想法将不胜感激。

这是数据:

library(tidyverse)
library(ggplot2)

my_df <- structure(list(group2 = c("CxHy", "CxHy", "CxHy", "CxHy", "CxHy", 
                                   "CxHy", "CxHy", "CxHy", "TERP", "TERP", "TERP", "TERP", "TERP", 
                                   "TERP", "TERP", "TERP", "CxHy", "CxHy", "CxHy", "CxHy", "CxHy", 
                                   "CxHy", "CxHy", "CxHy", "TERP", "TERP", "TERP", "TERP", "TERP", 
                                   "TERP", "TERP", "TERP"), rate = c(35.0413764604317, 1.581780096, 
                                                                     48.1546154514286, 5.6177417568, 118.07707609554, 9.78168399744, 
                                                                     125.236895496, 8.71879325664, 137.594582077252, 14.0889705513239, 
                                                                     630.450644424867, 42.8764673332745, 752.039882591234, 23.2549865965314, 
                                                                     1385.89284580167, 77.9737494781406, 0, 0, 0, 0.51091296192, 12.1578219080288, 
                                                                     1.121021002368, 26.1570828734857, 0.958406204448, 311.87378680008, 
                                                                     41.0741226543657, 889.66751457975, 32.9591458117879, 667.747148244659, 
                                                                     26.9290441959229, 1343.81735772991, 39.2757060997948), jar1 = c("1", 
                                                                                                                                     "2", "3", "4", "1", "2", "3", "4", "1", "2", "3", "4", "1", "2", 
                                                                                                                                     "3", "4", "1", "2", "3", "4", "1", "2", "3", "4", "1", "2", "3", 
                                                                                                                                     "4", "1", "2", "3", "4"), days_incubated = c(0L, 0L, 0L, 0L, 
                                                                                                                                                                                  4L, 4L, 4L, 4L, 0L, 0L, 0L, 0L, 4L, 4L, 4L, 4L, 0L, 0L, 0L, 0L, 
                                                                                                                                                                                  4L, 4L, 4L, 4L, 0L, 0L, 0L, 0L, 4L, 4L, 4L, 4L)), row.names = c(NA, 
                                                                                                                                                                                                                                                  -32L), class = "data.frame")

这是图表的代码:

df_sum <- my_df %>% 
  group_by(jar1, group2, days_incubated) %>% 
  summarise(sum_rate=sum(rate)) %>% 
  group_by(days_incubated, jar1) %>% 
  mutate(sum_jar1=sum(sum_rate)) %>% 
  mutate(rel_jar1=sum_rate/sum_jar1) %>% 
  group_by(days_incubated, jar1) %>% 
  mutate(perc_terp=rel_jar1[group2=="TERP"]) %>% 
  mutate(group2=fct_inorder(group2) %>% 
  fct_rev())

#> `summarise()` regrouping output by 'jar1', 'group2' (override with `.groups` argument)

levels(df_sum$group2)
#> [1] "TERP" "CxHy"

df_sum %>% 
  ggplot()+
  geom_bar(aes(x=tidytext::reorder_within(
    x=jar1,
    by=perc_terp,
    within=days_incubated),
    y=sum_rate,
    fill=group2),
    position="fill",
    stat="identity")+
  facet_wrap(vars(days_incubated),
  scale="free_x")+
  tidytext::scale_x_reordered()+
  theme_bw() + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.4), 
  axis.text=element_text(size=7))

标签: rggplot2

解决方案


我们可以重新排序jar1并绘制它,而不需要scale_x_reordered

df_sum %>% 
  mutate(jar1 = factor(jar1, 
                       levels = df_sum %>% 
                                filter(group2 == "TERP", days_incubated == 0) %>% 
                                pluck("perc_terp") %>% 
                                order())) %>%
  ggplot() +
  geom_col(aes(x = jar1, y = sum_rate, fill = group2), position = "fill") +
  facet_wrap(vars(days_incubated)) +
  theme_bw() + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.4), 
        axis.text = element_text(size = 7))

在此处输入图像描述


推荐阅读