如何在R中创建按堆叠列总和排序的堆叠柱状图?
在R中创建按堆叠总和排序的堆叠柱状图
直接上可运行的完整代码:
library(tidyverse) df <- data.frame( Name = c("A", "B", "C", "D"), Input1 = c(5, 15, 10, 5), Input2 = c(20, 15, 5, 15) ) # 转长格式+计算每个Name的总数值 df1 <- df %>% pivot_longer( cols = c("Input1", "Input2"), names_to = "Combined", values_to = "Variable" ) %>% group_by(Name) %>% mutate(Total = sum(Variable)) %>% ungroup() # 生成目标堆叠图 df1 %>% ggplot(aes( x = fct_reorder(Name, desc(Total)), # 按总和降序排列X轴 y = Variable, fill = Combined )) + geom_col(position = "stack") + labs(x = "类别名称", y = "数值") # 可选:自定义坐标轴标签
关键步骤说明
- 整合数据处理:把宽转长和计算总和放在同一个管道里,避免分开处理数据导致的不一致。这里通过
group_by(Name) %>% mutate(Total = sum(Variable))算出每个类别的总堆叠值。 - X轴排序:用
fct_reorder(Name, desc(Total))重新定义Name的因子顺序——按Total的降序排列。如果想要升序,去掉desc()即可。 - 堆叠效果保留:保持
geom_col(position = "stack")不变,就能维持原来的堆叠显示效果。
另一种实现方式(用原数据的总和列)
如果已经提前算出了总列,也可以先合并数据再排序:
# 先给原数据加总和列 df$Total <- rowSums(df[, c("Input1", "Input2")]) # 转长格式时带上总和列 df1 <- df %>% pivot_longer( cols = c("Input1", "Input2"), names_to = "Combined", values_to = "Variable" ) # 同样生成排序后的堆叠图 df1 %>% ggplot(aes( x = fct_reorder(Name, desc(Total)), y = Variable, fill = Combined )) + geom_col(position = "stack")
内容的提问来源于stack exchange,提问作者OSH.DC51
相关产品推荐
相关产品推荐

