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

如何用ggplot设置堆叠柱状图的不同起始点?

实现跨类别累积的堆叠柱状图

要实现每个类别的柱子起始于上一个类别的终点,你需要手动计算每个堆叠部分的绝对位置,而非依赖ggplot默认的从0开始的堆叠逻辑。以下是具体实现方案:

步骤1:预处理数据

先计算每个类别的总偏移量(即到上一个类别为止的累积总和),再推导每个堆叠部分的起始与结束位置:

library(ggplot2)
library(dplyr)

# 原始数据
df <- data.frame(Name = c("A", "A", "A", "B", "B", "B", "C", "C", "C"), 
                 category = rep(1:3, times=3), 
                 value = c(5, 8, 4, 3, 1, 8, 5, 11, 3), 
                 difference_value = c(5, 3, -4, 3, -2, 7, 5, 6, -8))

# 保持你指定的Name堆叠顺序(按difference_value排序)
df <- df %>% mutate(Name = reorder(Name, difference_value))

# 计算每个category的总差值,以及跨类别的累积偏移量
category_totals <- df %>%
  group_by(category) %>%
  summarise(total = sum(difference_value)) %>%
  mutate(offset = cumsum(total) - total)  # 第一个category偏移为0,后续为前序类别总和

# 合并偏移量到原数据,计算每个堆叠部分的起止位置
df <- df %>%
  left_join(category_totals, by = "category") %>%
  group_by(category) %>%
  arrange(Name) %>%
  mutate(
    cumulative = cumsum(difference_value),
    ymin = offset + cumulative - difference_value,  # 堆叠部分的起始y值
    ymax = offset + cumulative                     # 堆叠部分的结束y值
  ) %>%
  ungroup()

步骤2:绘制图形

用geom_rect精确绘制每个堆叠部分,模拟默认柱状图的样式:

ggplot(df, aes(fill = Name)) +
  # 控制x轴宽度,和默认柱状图保持一致
  geom_rect(aes(
    xmin = as.numeric(factor(category)) - 0.4,
    xmax = as.numeric(factor(category)) + 0.4,
    ymin = ymin,
    ymax = ymax
  )) +
  labs(x = "category", y = "Value") +
  theme_minimal()

效果说明

  • 每个category的堆叠起始点是上一个category的最终位置(比如category2从category1的总和13开始)
  • 正的difference_value向上延伸,负值向下延伸,完全匹配你的需求
  • 保留了你原代码中指定的Name堆叠顺序

内容的提问来源于stack exchange,提问作者msug

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:20:03