You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 18:43:33