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

基于源节点为桑基图链接着色:sankeyNetwork::colourScale异常问题

问题与解决方案

问题描述

在RStudio中使用networkD3绘制桑基图时,遇到两个问题:

  1. 添加colourScale参数后图表显示空白,无法按源节点组(SOF_Data$Species_Binomial)为链接着色;
  2. 设置NodeGroup指定节点颜色时,无论nodes_SOF_Data$color输入何种颜色,节点始终显示默认蓝色。

初始数据框与节点列表创建

library(dplyr)
library(networkD3)
library(htmlwidgets)
library(data.table)

SOF_Data <- data.frame(
  Species_Binomial = c("C. artedi", "C. artedi", "C. artedi", "C. artedi", "C. artedi", "C. artedi", "C. fera", "C. fera"),
  Life_Stage = c("Larva/fry", "Embryotic/egg", "Embryotic/egg", "Embryotic/egg", "Embryotic/egg", "Larva/fry", "Embryotic/egg", "Larva/fry"),
  Effect_Category = c("Growth", "Growth", "Survival", "Growth", "Growth", "Growth", "Growth", "Growth"),
  Categorical_Effect = c("Growth rate", "Other - Specific", "Survival - Specific", "Development rate", "50% hatching time", "Growth rate", "Development rate", "Otolith growth"))
 
nodes_SOF_Data <- data.frame(name = unique(c(
  SOF_Data$Species_Binomial,
  SOF_Data$Life_Stage,
  SOF_Data$Effect_Category,
  SOF_Data$Categorical_Effect))) 
nodes_SOF_Data$color <- "#000"

链接创建

links1_SOF_Data <- SOF_Data %>%
  group_by(Species_Binomial, Life_Stage) %>%
  summarize(value = n()) %>%
  ungroup() %>%
  mutate(source = match(Species_Binomial, nodes_SOF_Data$name) - 1,
         target = match(Life_Stage, nodes_SOF_Data$name) - 1,
         LinkGroup = Species_Binomial)

links2_SOF_Data <- SOF_Data %>% 
  group_by(Species_Binomial, Life_Stage, Effect_Category) %>% 
  summarize(value = n()) %>% 
  ungroup() %>% 
  mutate(source = match(Life_Stage, nodes_SOF_Data$name) - 1,
         target = match(Effect_Category, nodes_SOF_Data$name) - 1,
         LinkGroup = Species_Binomial) 

links3_SOF_Data <- SOF_Data %>% 
  group_by(Species_Binomial, Effect_Category, Categorical_Effect) %>% 
  summarize(value = n()) %>% 
  ungroup() %>% 
  mutate(source = match(Effect_Category, nodes_SOF_Data$name) - 1,
         target = match(Categorical_Effect, nodes_SOF_Data$name) - 1,
         LinkGroup = Species_Binomial)

links_SOF_Data <- bind_rows(links1_SOF_Data, links2_SOF_Data, links3_SOF_Data)

links_SOF_Data <- links_SOF_Data %>%
  mutate(color = case_when(Species_Binomial == "C. artedi" ~ "#66c2a5", 
Species_Binomial == "C. fera" ~ "#e78ac3"))

问题原因与修正代码

核心问题解析

  1. 图表空白:colourScale参数要求传入d3的颜色比例尺函数,而非直接返回颜色值的函数。之前定义的colour_scale_species不符合参数规范,导致渲染异常。若要直接使用链接数据中的color字段,应使用linkColour参数。
  2. 节点颜色无效:NodeGroup用于指定节点分组列,再通过colourScale映射分组到颜色;若要直接读取节点数据中的color字段,需使用nodeColour参数,而非NodeGroup。

修正后的桑基图代码

sankey_SOF_Data <- sankeyNetwork(
  Links = links_SOF_Data, 
  Nodes = nodes_SOF_Data, 
  Source = "source", 
  Target = "target", 
  Value = "value", 
  NodeID = "name", 
  units = "Count", 
  fontSize = 12, 
  nodeWidth = 30, 
  # 直接读取节点的color字段设置节点颜色
  nodeColour = JS("function(d) { return d.color; }"),
  # 直接读取链接的color字段设置链接颜色
  linkColour = JS("function(d) { return d.color; }")
)
sankey_SOF_Data

另一种方案:通过分组映射颜色

若希望通过LinkGroup和节点分组来统一管理颜色,可定义d3颜色比例尺:

# 定义颜色映射规则:物种对应颜色,节点默认黑色
colour_scale <- JS('d3.scaleOrdinal()
  .domain(["C. artedi", "C. fera", "default"])
  .range(["#66c2a5", "#e78ac3", "#000"])')

# 给节点添加分组列,物种节点用对应物种名,其他节点标记为default
nodes_SOF_Data <- nodes_SOF_Data %>%
  mutate(NodeGroup = ifelse(name %in% SOF_Data$Species_Binomial, name, "default"))

sankey_SOF_Data <- sankeyNetwork(
  Links = links_SOF_Data, 
  Nodes = nodes_SOF_Data, 
  Source = "source", 
  Target = "target", 
  Value = "value", 
  NodeID = "name", 
  units = "Count", 
  fontSize = 12, 
  nodeWidth = 30, 
  NodeGroup = "NodeGroup",
  LinkGroup = "LinkGroup",
  colourScale = colour_scale
)
sankey_SOF_Data

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:19:52