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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:57:57