如何将ggsankey桑基图的flow.fill按最终节点设置颜色?
解决方案
要让桑基图的流颜色依据最终节点(示例中为time_1的节点)填充,只需将ggplot的填充映射从node(前序节点)改为next_node(目标节点),具体修改如下:
修改后的完整代码
library(tidyverse) library(ggsankey) set.seed(2) # 构造数据 df <- tibble( id = seq(1:22168), time_0 = c(rep("red", 13309), rep("yellow", 8699), rep("green", 160)), time_1 = c(rep("red", 1110), rep("yellow", 3771), rep("green", 8428), rep("red", 321), rep("yellow", 1940), rep("green", 6438), rep("red", 4), rep("yellow", 26), rep("green", 130)) ) %>% {. ->> df2} %>% mutate(across(starts_with("time"), factor, levels = c("green", "yellow", "red"))) # 转换为桑基图格式 df_sankey <- df %>% ggsankey::make_long(time_0, time_1) # 统计节点数量 df_sankey_t <- df_sankey %>% dplyr::group_by(x, node)%>% tally() df_sankey <- df_sankey %>% left_join(df_sankey_t, by = c("x", "node")) # 绘制桑基图,核心修改:fill映射为next_node ggplot(df_sankey, aes(x = x, next_x = next_x, node = node, next_node = next_node, fill = factor(next_node), # 改为目标节点映射 label = paste0(node," n=", n))) + geom_sankey(flow.alpha = 0.6, node.color = "gray30") + geom_sankey_label(size = 3, color = "white", fill = "gray40") + scale_fill_manual(values = c("green", "red", "yellow")) + theme_sankey(base_size = 18) + theme(legend.position = "none", plot.title.position = "plot", plot.title = element_text(face="bold", size=20), plot.subtitle = element_text(size=15)) + labs(title = "桑基图示例", subtitle = "流颜色依据最终节点设置", x = NULL)
关键说明
- 核心修改点:将
ggplot美学映射中的fill = factor(node)替换为fill = factor(next_node),这样每个流的颜色就会由它的目标节点(即最终节点)决定,所有流入time_1中yellow节点的流都会显示黄色。 - 颜色映射
scale_fill_manual的参数无需调整,因为因子顺序和颜色对应关系保持一致。
内容的提问来源于stack exchange,提问作者Eric Green
相关产品推荐
相关产品推荐

