基于源节点为桑基图链接着色:sankeyNetwork::colourScale异常问题
问题与解决方案
问题描述
在RStudio中使用networkD3绘制桑基图时,遇到两个问题:
- 添加
colourScale参数后图表显示空白,无法按源节点组(SOF_Data$Species_Binomial)为链接着色; - 设置
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"))
问题原因与修正代码
核心问题解析
- 图表空白:
colourScale参数要求传入d3的颜色比例尺函数,而非直接返回颜色值的函数。之前定义的colour_scale_species不符合参数规范,导致渲染异常。若要直接使用链接数据中的color字段,应使用linkColour参数。 - 节点颜色无效:
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
相关产品推荐
相关产品推荐

