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

尝试用reorder()按总数降序排列堆叠条形图失败,该如何解决?

解决堆叠条形图按总计数降序排列的问题

你原来的代码没生效的核心原因是:在group_by(var) %>% count(var2)之后,每个var对应多条记录(每个var2类别各占一行),直接用reorder(var, n, sum)时,sum函数的作用逻辑没正确匹配每个var的总计数,导致排序规则失效。

下面提供两种可行的解决方法:

方法一:先预处理计算总计数

先算出每个var的总条数,再合并到数据框中,用这个总计数来排序:

library(tidyverse)

# 生成示例数据
df <- data.frame(var = sample(paste0("x", 1:10), size = 100, replace = TRUE),
                 var2 = sample(c("A", "B", "C", "D"), size = 100, replace = TRUE))

# 预处理数据,计算每个var的总计数
df_processed <- df %>%
  count(var, var2) %>%
  group_by(var) %>%
  mutate(total = sum(n)) %>% # 计算每个var的所有分段总条数
  ungroup()

# 绘制堆叠条形图,按total降序排列
ggplot(df_processed, aes(x = reorder(var, -total), y = n, fill = var2)) +  
  geom_col()

方法二:在reorder中直接计算总计数

无需提前预处理,直接在reorder函数里用ave计算每个var的总计数,取负数实现降序:

library(tidyverse)

df <- data.frame(var = sample(paste0("x", 1:10), size = 100, replace = TRUE),
                 var2 = sample(c("A", "B", "C", "D"), size = 100, replace = TRUE))

df %>% 
  group_by(var) %>%
  count(var2) %>%
  ggplot(aes(x = reorder(var, -ave(n, var, FUN = sum)), y = n, fill = var2)) +  
    geom_col()

两种方法都能实现按每个var的所有分段总数降序排列柱子的效果,你可以根据自己的习惯选择。

内容的提问来源于stack exchange,提问作者D. Studer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:05:18