使用reorder_within结合facet_wrap时排序异常的技术求助
解决分面柱状图内排序异常的方案
先确认数据预处理的正确性
首先要确保Top10数据是严格按年份分组提取的,避免因分组逻辑错误导致排序混乱:
library(tidyverse) library(tidytext) # 替换成你的实际数据列名 clean_data <- 原始数据框 %>% filter(!is.na(id)) %>% filter(Party != "Independent") %>% # 按年份、议员及其他维度分组统计参与次数 group_by(Year, `MoC Name`, Party, Chamber) %>% summarise(n = sum(participation_metric), .groups = "drop") %>% # 按年份分组取Top10,with_ties=FALSE避免并列导致超量 group_by(Year) %>% slice_max(n, n = 10, with_ties = FALSE) %>% ungroup()
方法1:修正reorder_within的使用姿势
reorder_within需要在aes中直接调用,且确保第三个参数是分组的年份变量,同时配合scale_y_reordered():
ggplot(clean_data, aes(x = n, y = reorder_within(`MoC Name`, n, Year))) + geom_col(fill = "#2E86AB") + facet_wrap(~Year, scales = "free_y") + scale_y_reordered() + labs(x = "参与次数", y = "国会议员姓名")
方法2:手动生成分组因子(更稳定)
如果reorder_within仍有问题,直接按年份分组后手动设置因子水平,彻底规避函数的潜在问题:
clean_data <- clean_data %>% group_by(Year) %>% arrange(desc(n)) %>% # 按参与次数降序排列 mutate(`MoC Name` = factor(`MoC Name`, levels = unique(`MoC Name`))) %>% # 绑定当前年份的排序 ungroup() ggplot(clean_data, aes(x = n, y = `MoC Name`)) + geom_col(fill = "#2E86AB") + facet_wrap(~Year, scales = "free_y") + labs(x = "参与次数", y = "国会议员姓名")
常见问题排查
- 检查
slice_max是否加了with_ties=FALSE:如果存在并列排名,会导致单年份记录超过10条,干扰排序逻辑 - 确认分组统计时没有提前
ungroup:slice_max必须在group_by(Year)之后执行,否则会全局取Top10而非按年取 - 确保
tidytext包已正确加载:scale_y_reordered()是tidytext的函数,未加载会报错或失效
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

