R语言sankeyNetwork桑基图颜色匹配错误及可视化方案问询
问题根因
颜色匹配错误是两个原因导致的:
- 提前对dummynodes的
name列做了gsub("_old","")处理,导致节点表出现重复名称,D3的序数比例尺无法正确映射重复键值 sankeyNetwork的colourScale默认匹配节点表的name列值,重复值会导致后续映射覆盖前序规则
解决方案1:调整networkD3代码实现需求
不需要修改现有数据结构,只需要新增节点分组列,把颜色映射到分组而非显示名称即可,修改后完整代码如下:
library(networkD3) library(dplyr) stat.old<-c("new2021","casual_old","established_local_old","established_old","unknown_old","questionable_old") stat.new<-c("casual","established_local","established","unknown","questionable", "extinct") dummytest<-expand.grid(stat.old=stat.old,stat.new=stat.new) # value定义对应“流”中的物种数量 dummytest$value<-sample(c(0:50),36,replace=T) # 构造节点表时保留原始唯一名称,新增group列存储显示用的分类名 dummynodes<-data.frame(name = unique(c(as.character(dummytest$stat.old), as.character(dummytest$stat.new)))) %>% mutate(group = gsub("_old","", name)) # 使用match()函数获取节点ID dummytest$idsource<-match(dummytest$stat.old, dummynodes$name)-1 dummytest$idtarget<-match(dummytest$stat.new, dummynodes$name)-1 # 颜色映射直接对应group的唯一值即可 my_color <- 'd3.scaleOrdinal() .domain(["new2021","casual","established_local","established","unknown","questionable", "extinct"]) .range(["red","darkolivegreen2","darkolivegreen3","darkolivegreen4","gold3","darkgrey", "black"])' # 新增nodeGroup参数指定映射分组列 sankeyNetwork(Links=dummytest, Nodes=dummynodes, Source="idsource",Target="idtarget", Value="value", NodeID="group", sinksRight=F, fontSize=22, fontFamily="Calibri", colourScale=my_color, nodeGroup = "group")
解决方案2:用ggalluvial绘制冲积图(替代带连线的双层堆叠柱状图)
如果更习惯ggplot2语法,可以用ggalluvial包实现同类可视化,颜色映射逻辑更简单,不需要处理D3语法:
library(ggplot2) library(ggalluvial) # 直接用原始流转数据绘图 ggplot(dummytest, aes(y = value, axis1 = stat.old, axis2 = stat.new)) + geom_alluvium(width = 1/12, alpha = 0.6) + geom_stratum(aes(fill = gsub("_old","", after_stat(stratum))), width = 1/12) + scale_x_discrete(limits = c("旧分类状态", "新分类状态"), expand = c(0.05, 0.05)) + scale_fill_manual(values = c("new2021" = "red", "casual" = "darkolivegreen2", "established_local" = "darkolivegreen3", "established" = "darkolivegreen4", "unknown" = "gold3", "questionable" = "darkgrey", "extinct" = "black")) + labs(y = "物种数量") + theme_minimal() + theme(legend.position = "none")
内容的提问来源于stack exchange,提问作者Gmichael
相关产品推荐
相关产品推荐

