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

如何用ggplot2为分组堆叠柱状图添加匹配数值的曲线连接区域?

在ggplot2中实现带曲线连接的堆叠柱状图

可以通过预处理数据计算堆叠边界,再结合多边形或贝塞尔曲线实现需求,以下是具体步骤和代码:

步骤1:预处理数据,计算堆叠上下限

首先需要将分组变量转为连续数值,并计算每个堆叠部分的上下边界(ymin和ymax),这是确保曲线区域匹配数值的核心:

library(ggplot2)
library(dplyr)

# 原始数据
data = rbind(
  data.frame(val = c(10, 30, 15), name = c('A', 'B', 'C'), group = 'gr1'),
  data.frame(val = c(30, 40, 12), name = c('A', 'B', 'C'), group = 'gr2')
)

# 将分组转为连续数值,方便绘制跨组曲线
data$x = ifelse(data$group == "gr1", 1, 2)

# 计算每个堆叠部分的上下边界
data = data %>%
  arrange(group, name) %>%
  group_by(group) %>%
  mutate(
    ymax = cumsum(val),  # 堆叠上限
    ymin = lag(ymax, default = 0)  # 堆叠下限
  ) %>%
  ungroup()

步骤2:绘制曲线连接的填充区域

方案1:基础多边形填充(直线过渡)

用geom_polygon生成连接两组对应堆叠部分的填充区域,保留原始柱状图作为参考:

# 生成多边形连接数据
connect_data = data %>%
  group_by(name) %>%
  summarise(
    x = c(x, rev(x)),
    y = c(ymin, rev(ymax))
  ) %>%
  ungroup()

ggplot() +
  # 绘制原始堆叠柱状图
  geom_bar(data = data, aes(x = x, y = val, fill = name), 
           stat = "identity", position = "stack", width = 0.1) +
  # 绘制连接区域
  geom_polygon(data = connect_data, aes(x = x, y = y, fill = name), 
               alpha = 0.5, linetype = "dashed") +
  # 还原x轴标签
  scale_x_continuous(breaks = c(1, 2), labels = c("gr1", "gr2")) +
  labs(x = "group", y = "val") +
  theme_minimal()

方案2:平滑贝塞尔曲线填充

如果需要更自然的曲线过渡,可以使用ggforce包的geom_bezier:

library(ggforce)

# 生成贝塞尔曲线数据(包含中间控制点)
bezier_data = data %>%
  group_by(name) %>%
  summarise(
    x = c(x[1], (x[1]+x[2])/2, x[2], x[2], (x[1]+x[2])/2, x[1]),
    y = c(ymin[1], ymin[1], ymin[2], ymax[2], ymax[1], ymax[1]),
    group = cur_group_id()
  ) %>%
  ungroup()

ggplot() +
  geom_bar(data = data, aes(x = x, y = val, fill = name), 
           stat = "identity", position = "stack", width = 0.1) +
  # 绘制平滑曲线填充区域
  geom_bezier(data = bezier_data, aes(x = x, y = y, group = group, fill = name), 
              stat = "bezier", alpha = 0.5) +
  scale_x_continuous(breaks = c(1, 2), labels = c("gr1", "gr2")) +
  labs(x = "group", y = "val") +
  theme_minimal()

关键说明

  • 必须计算ymin和ymax:堆叠柱状图的位置是累积值,直接使用原始val无法定位到每个堆叠部分的实际上下边界。
  • 连续x轴:将分组转为数值型x轴,才能在两组之间绘制连接元素。
  • 填充匹配:通过按name分组生成连接数据,确保每个曲线区域对应原始柱状图的组成部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:15:42