如何在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
相关产品推荐
相关产品推荐

