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

如何在R的ggsankey桑基图中为流添加渐变填充色

给ggsankey桑基图的流添加渐变填充色

方法思路

要实现桑基图流的渐变填充,核心是给每个节点→下一节点的流段分配起始色和结束色,借助ggpattern包的geom_sankey_pattern实现渐变填充(原生geom_sankey不支持渐变填充)。

具体实现步骤

1. 加载依赖包并生成数据(保留原有代码)

library(ggsankey)
library(tidyverse)
library(ggpattern) # 新增用于渐变填充的包

# 生成模拟数据
s1 <- sample(x= c("Single",
                  "Married", 
                  "Married with kids", 
                  "Married Without kids"), 
             size = 100, 
             replace=TRUE)
s2 <- sample(x= c("Male", 
                  "Female"), 
             size = 100, 
             replace=TRUE)
s3 <- sample(x= c("Happy", 
                  "Not Happy"), 
             size = 100, 
             replace=TRUE)

d <- data.frame(cbind(s1,s2,s3))
names(d) <- c('Relationship', 
              'Gender', 
              'Outcome')

# 转换为桑基图所需的long格式
df <- d %>%
  make_long(Relationship, 
            Gender, 
            Outcome)

2. 定义节点颜色并给流分配渐变起止色

可以给所有节点分配基础颜色,同时单独指定特定流(比如Single→Male)的渐变颜色,其他流自动使用节点颜色渐变:

# 定义节点基础颜色
new_colors <- RColorBrewer::brewer.pal(name = "Set3", n = 8)
new_colors <- setNames(new_colors, levels(as.factor(df$node)))

# 给每个流添加起始色和结束色
df <- df %>%
  mutate(
    # 起始色:默认用当前节点颜色,单独指定Single→Male为粉色
    start_color = case_when(
      node == "Single" & next_node == "Male" ~ "#FF6B6B",
      TRUE ~ new_colors[node]
    ),
    # 结束色:默认用下一节点颜色,单独指定Single→Male为紫色
    end_color = case_when(
      node == "Single" & next_node == "Male" ~ "#9D4EDD",
      TRUE ~ new_colors[next_node]
    )
  )

3. 绘制带渐变流的桑基图

用geom_sankey_pattern替代原生geom_sankey,设置渐变参数:

ggplot(df, aes(x = x,                        
               next_x = next_x,                                     
               node = node,
               next_node = next_node,
               # 映射渐变的起止色
               pattern_fill_start = start_color,
               pattern_fill_end = end_color)) +
  # 绘制带渐变填充的流
  geom_sankey_pattern(
    pattern = "gradient",
    pattern_direction = "horizontal", # 渐变方向与流的方向一致(从左到右)
    pattern_spacing = 0, # 消除渐变间隙
    node.color = "black",
    show.legend = FALSE
  ) +
  # 绘制节点(保留原有节点填充色)
  geom_sankey_node(aes(fill = node), color = "black") +
  # 节点颜色映射
  scale_fill_manual(values = new_colors) +
  # 使用桑基图专用主题
  theme_sankey() +
  labs(title = "桑基图:带渐变流的示例")

关键说明

  • pattern_direction设置为horizontal是因为桑基图的流是横向从左到右,渐变方向与流方向匹配,能实现从起始节点到下一节点的自然过渡
  • 如果不需要单独指定特定流的颜色,直接去掉case_when的条件分支即可,所有流都会自动使用起始节点到下一节点的颜色渐变
  • ggpattern包需要提前安装:install.packages("ggpattern")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:58:13