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

如何在R语言中用ggalluvial为桑基图各轴分层自定义着色?

为ggalluvial桑基图的不同轴单独设置颜色方案

问题说明

使用ggalluvial绘制桑基图时,需要为三个轴(transitionState_PB、DC_PIB、transitionState_PI)分别应用不同的颜色映射规则,而非统一使用一套颜色。现有数据、绘图代码及目标颜色集合如下:

数据框

library(ggalluvial)
allu1 <- tibble::tribble(
  ~transitionState_PB,  ~DC_PIB, ~transitionState_PI, ~Freq,
             "BATF3",   "BATF3",                 "PI",    2,
             "BATF3",      "PB",                 "PI",    1,
             "BATF3",     "PIB",                 "PI",    1,
             "BATF3",   "BATF3",               "PU.1",    1,
             "BATF3",     "PIB",               "PU.1",    1,
             "BATF3",   "BATF3",            "unbound",    1,
                "PB",    "IRF8",               "IRF8",    4,
                "PB",      "PI",               "IRF8",    2,
                "PB",   "BATF3",                 "PI",    7,
                "PB",      "IB",                 "PI",    2,
                "PB",    "IRF8",                 "PI",    7,
                "PB",      "PB",                 "PI",   10,
                "PB",      "PI",                 "PI",   10,
                "PB",     "PIB",                 "PI",  232,
                "PB",    "PU.1",                 "PI",  121,
                "PB", "unbound",                 "PI",   80,
                "PB",   "BATF3",               "PU.1",    4,
                "PB",      "PB",               "PU.1",    6,
                "PB",     "PIB",               "PU.1",    8,
                "PB",    "PU.1",               "PU.1",   4)

当前绘图代码

plot <- ggplot(data = allu1,
               aes(axis1 = transitionState_PB, axis2= DC_PIB, axis3= transitionState_PI,y = Freq)) +
  geom_alluvium(aes(fill = DC_PIB)) +
  geom_stratum(aes(fill= DC_PIB)) +
  scale_x_continuous(breaks = 1:3, labels = c("transitionState_PB","DC_PIB","transitionState_PI"))+
  geom_text(stat = "stratum",
            aes(label = after_stat(stratum)), size=2.6) +
  scale_fill_manual(values = PIBcol, name = c("transitionState_PB","DC_PIB","transitionState_PI"))+labs(x = colnames(allu1[, -4]), y = "Frequency") + 
  ggtitle("Loops vs peaks in loops common to- PB, PI & PIB") + theme_bw() +   xlab("From Tranition states to PIB") +         
  theme(legend.position = "bottom",
        title = element_text(size = 12), 
        legend.text = element_text(size = 10),
        axis.text.y = element_text(size=8),
        axis.text.x = element_text(size=8))

plot

目标颜色规则

原代码中PBcol被重复赋值,这里修正为三个轴对应的颜色集合:

# 对应DC_PIB轴的颜色
PIBcol <- c("PU.1" = "#4C0099", "BATF3" = "#994C00", "IRF8" = "#006600","PB" = "#FFB266", "PI" = "#66B2FF", "IB" = "#FFE60A", "PIB" = "#CC0088","unbound" = "#A0A0A0")
# 对应transitionState_PB轴的颜色
PBcol <- c("PU.1" = "#4C0099", "BATF3" = "#994C00", "PB" = "#FFB266", "unbound" = "#A0A0A0")
# 对应transitionState_PI轴的颜色
PIcol <- c("PU.1" = "#4C0099", "IRF8" = "#006600", "PI" = "#66B2FF","unbound" = "#A0A0A0")

解决方案

要实现不同轴单独着色,需要分三次调用geom_stratum,每次指定作用的轴,并绑定对应的颜色映射。同时保留geom_alluvium的填充逻辑,具体代码如下:

# 先修正颜色变量名
PIBcol <- c("PU.1" = "#4C0099", "BATF3" = "#994C00", "IRF8" = "#006600","PB" = "#FFB266", "PI" = "#66B2FF", "IB" = "#FFE60A", "PIB" = "#CC0088","unbound" = "#A0A0A0")
PBcol <- c("PU.1" = "#4C0099", "BATF3" = "#994C00", "PB" = "#FFB266", "unbound" = "#A0A0A0")
PIcol <- c("PU.1" = "#4C0099", "IRF8" = "#006600", "PI" = "#66B2FF","unbound" = "#A0A0A0")

# 绘制桑基图
plot <- ggplot(data = allu1,
               aes(axis1 = transitionState_PB, axis2= DC_PIB, axis3= transitionState_PI, y = Freq)) +
  # 保留冲积层的填充(用DC_PIB的颜色)
  geom_alluvium(aes(fill = DC_PIB)) +
  # 第一个轴:transitionState_PB,使用PBcol颜色
  geom_stratum(aes(axis = 1, fill = after_stat(stratum))) +
  scale_fill_manual(values = PBcol, guide = "none") +
  # 第二个轴:DC_PIB,使用PIBcol颜色
  geom_stratum(aes(axis = 2, fill = after_stat(stratum))) +
  scale_fill_manual(values = PIBcol, guide = "none") +
  # 第三个轴:transitionState_PI,使用PIcol颜色
  geom_stratum(aes(axis = 3, fill = after_stat(stratum))) +
  scale_fill_manual(values = PIcol, name = "Categories") +
  # 设置x轴标签
  scale_x_continuous(breaks = 1:3, labels = c("transitionState_PB","DC_PIB","transitionState_PI")) +
  # 添加轴标签文本
  geom_text(stat = "stratum", aes(label = after_stat(stratum)), size=2.6) +
  # 标题和主题设置
  ggtitle("Loops vs peaks in loops common to- PB, PI & PIB") +
  labs(x = "From Transition states to PIB", y = "Frequency") +
  theme_bw() +
  theme(legend.position = "bottom",
        title = element_text(size = 12), 
        legend.text = element_text(size = 10),
        axis.text.y = element_text(size=8),
        axis.text.x = element_text(size=8))

plot

关键说明

  1. 每次调用geom_stratum时,通过axis = n指定作用的轴(1对应第一个轴,2对应第二个,3对应第三个),并用after_stat(stratum)获取当前轴的类别作为填充依据。
  2. 每个轴对应的scale_fill_manual设置对应的颜色集合,前两个轴设置guide = "none"避免生成重复图例,第三个轴保留图例作为统一展示。
  3. 冲积层(geom_alluvium)的填充逻辑可根据需求调整,示例中保留原逻辑使用DC_PIB的颜色,若需要其他规则可修改aes(fill = ...)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:44:54