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

如何使用ggalluvial为单个层盒着色,其余层保留白色

解决ggalluvial中终端层盒与流颜色匹配且其他层为白色的问题

问题描述

使用ggalluvial绘制冲积图时,需要实现:

  • 终端层(bin轴)的层盒(stratum)颜色与流(alluvium)颜色一致
  • 其他层(lev1、lev2轴)的层盒填充为白色
  • 图例仅显示终端层的颜色,不出现NA或白色条目

解决方案

核心思路是分两次调用geom_stratum,分别处理终端层和其他层,避免颜色映射产生的NA值和图例污染:

library(ggalluvial)

# 生成示例数据
dat <- expand.grid(lev1 = LETTERS[1:3], lev2 = letters[1:3], bin = as.character(1:3))
set.seed(1111)
dat$value <- rpois(n = nrow(dat), lambda = 3)
dat <- dat[order(dat$bin, dat$lev1, dat$lev2),]

# 绘制目标冲积图
ggplot(data = dat) + 
  aes(axis1 = lev1, axis2 = lev2, axis3 = bin, y = value) + 
  # 流的颜色绑定到bin,与终端层匹配
  geom_alluvium(aes(fill = bin)) +
  # 1. 绘制终端层(bin轴)的层盒,颜色绑定到bin
  geom_stratum(data = function(x) x[x$axis == "bin",], aes(fill = bin)) +
  # 2. 绘制其他层的层盒,直接设置为白色,不映射变量(避免进入图例)
  geom_stratum(data = function(x) x[x$axis != "bin",], fill = "white") +
  # 添加层盒标签
  geom_text(stat = "stratum", aes(label = after_stat(stratum)), size = 3) + 
  scale_x_discrete(limits = c("lev1", "lev2", "bin"), expand = c(.15, .05)) +
  # 自定义颜色(可选,根据需求调整)
  scale_fill_manual(values = c("1" = "#E69F00", "2" = "#56B4E9", "3" = "#009E73")) +
  theme(text = element_text(size = 9),
        axis.text.x = element_text(angle = 90, hjust = 0, vjust = 0.3, size = 9))

关键细节说明

  1. 分图层绘制层盒:
    • 第一次geom_stratum通过data = function(x) x[x$axis == "bin",]筛选出终端层数据,绑定fill = bin实现颜色匹配
    • 第二次geom_stratum筛选出其他层数据,直接设置fill = "white",由于没有将fill映射到数据变量,白色不会出现在图例中
  2. 流的颜色绑定:geom_alluvium(aes(fill = bin))确保流的颜色与终端层完全一致
  3. 图例控制:仅fill = bin的映射会生成图例,避免了NA或白色条目干扰

内容的提问来源于stack exchange,提问作者Marc in the box

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:50:13