如何在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
关键说明
- 每次调用
geom_stratum时,通过axis = n指定作用的轴(1对应第一个轴,2对应第二个,3对应第三个),并用after_stat(stratum)获取当前轴的类别作为填充依据。 - 每个轴对应的
scale_fill_manual设置对应的颜色集合,前两个轴设置guide = "none"避免生成重复图例,第三个轴保留图例作为统一展示。 - 冲积层(
geom_alluvium)的填充逻辑可根据需求调整,示例中保留原逻辑使用DC_PIB的颜色,若需要其他规则可修改aes(fill = ...)。
内容的提问来源于stack exchange,提问作者user20388122
相关产品推荐
相关产品推荐

