尝试用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
相关产品推荐
相关产品推荐

