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

如何在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 = "数值")  # 可选:自定义坐标轴标签

关键步骤说明

  1. 整合数据处理:把宽转长和计算总和放在同一个管道里,避免分开处理数据导致的不一致。这里通过group_by(Name) %>% mutate(Total = sum(Variable))算出每个类别的总堆叠值。
  2. X轴排序:用fct_reorder(Name, desc(Total))重新定义Name的因子顺序——按Total的降序排列。如果想要升序,去掉desc()即可。
  3. 堆叠效果保留:保持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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:13:14