r - 根据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))
解决方案
我们可以重新排序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))
推荐阅读
- angular - ExpressionChangedAfterItHasBeenCheckedError:带有两个同级 Angular 组件
- java - 转换地图
到地图 > 带有过滤器和流 - javascript - 在除 python 控制台之外的 chrome 扩展弹出窗口中显示发布响应(XMLHttpRequest)
- python - 我被 SKlearn 的属性错误困住了
- android - 不要杀死按下后退键的活动
- python - 根据变量值调用不同的函数
- sql - SQL查询仅获取值等于当前日期的列
- python - 如果字符串中包含停用词,则从字符串中删除一个元素
- google-app-maker - 如何防止appmaker中的重复记录?
- c# - 使用 UTF8 编码创建数据库