如何用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
相关产品推荐
相关产品推荐

