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

如何为ggplot堆叠geom_col的各子组部分设置透明度并填充对应y值

堆叠柱内部分填充的实现方案

原始数据

dat <- data.frame(group = c(rep("H", 4), rep("T",4)), subgroup = rep(c("A", "B", "C", "D"), 2),
               x = c(100, 10, 80, 50, 40, 50, 80, 70),
               y = c(20, 5, 50, 20, 20, 10, 40, 50))

需求说明

按group堆叠x值作为柱体总高度,按subgroup区分填充颜色;同时每个subgroup对应的柱体中,用y值填充其中一部分(高透明度),剩余部分(x-y)用低透明度显示,实现同一子组柱内的分层效果。

原代码问题

原代码两次调用geom_col都是基于堆叠逻辑,导致两次的堆叠柱体相互重叠,无法实现同一子组内的部分填充。

解决方案

需要将数据转换为长格式,把每个subgroup的x拆分为y(填充部分)和x-y(剩余部分),然后通过alpha映射区分这两部分:

library(tidyverse)

# 转换为长格式数据
dat_long <- dat %>%
  mutate(
    rest = x - y,  # 计算x中y之外的剩余部分
    type = "剩余"  # 标记剩余部分
  ) %>%
  select(group, subgroup, value = rest, type) %>%
  # 追加y对应的填充部分行
  bind_rows(
    dat %>%
      select(group, subgroup, value = y, type) %>%
      mutate(type = "填充")
  )

# 绘制图形
ggplot(dat_long, aes(x = group, y = value, fill = subgroup, alpha = type)) +
  geom_col(position = position_stack()) +
  # 自定义透明度:填充部分不透明,剩余部分半透明
  scale_alpha_manual(values = c("填充" = 1, "剩余" = 0.5)) +
  labs(alpha = "")  # 隐藏透明度图例(可选)

效果说明

  • 每个group下的堆叠柱总高度等于对应subgroup的x值之和;
  • 每个subgroup的柱体中,高透明度部分是y值,低透明度部分是x-y值,两者叠加正好等于x的高度;
  • 既保留了subgroup的填充颜色区分,又实现了柱内的部分填充效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:45:25