如何使用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))
关键细节说明
- 分图层绘制层盒:
- 第一次
geom_stratum通过data = function(x) x[x$axis == "bin",]筛选出终端层数据,绑定fill = bin实现颜色匹配 - 第二次
geom_stratum筛选出其他层数据,直接设置fill = "white",由于没有将fill映射到数据变量,白色不会出现在图例中
- 第一次
- 流的颜色绑定:
geom_alluvium(aes(fill = bin))确保流的颜色与终端层完全一致 - 图例控制:仅
fill = bin的映射会生成图例,避免了NA或白色条目干扰
内容的提问来源于stack exchange,提问作者Marc in the box
相关产品推荐
相关产品推荐

