R包networkD3的sankeyNetwork无法生成最少交叉的桑基图
解决networkD3桑基图不必要的连线交叉问题
你遇到的问题不是平台或RStudio的问题,而是networkD3的sankeyNetwork函数的布局逻辑导致的:它的节点初始位置严格按照你输入的nodes数据框顺序排列,iterations参数仅用于优化节点间的间距,不会自动调整节点上下顺序来消除连线交叉。
要解决这个问题,直接调整nodes数据框里的节点顺序,同时对应修改连线的索引即可,不用依赖高迭代次数。以下是两种可行的修改方式:
方式1:手动调整索引
library(networkD3) # 调整节点顺序,将Wind移到Solar前面 nodes<-data.frame(names=c('Wind', 'Solar', 'Natural Gas', 'Electricity', 'Hydrogen')) # 对应修改source索引(networkD3使用0-based索引) source<-c(1,0,2,1) target<-c(3,3,4,4) value<-c(13320, 274, 10950, 96000) links<-data.frame(source, target, value) p <- sankeyNetwork(Links = links, Nodes = nodes, Source = "source", Target = "target", Value = "value", NodeID = "names", iterations=32, units = "TWh", fontSize = 12, nodeWidth = 30, sinksRight = FALSE) p
方式2:通过节点名称自动匹配索引(更不易出错)
library(networkD3) library(dplyr) # 用节点名称定义连线,无需手动记索引 links_named <- data.frame( source = c('Solar', 'Wind', 'Natural Gas', 'Solar'), target = c('Electricity', 'Electricity', 'Hydrogen', 'Hydrogen'), value = c(13320, 274, 10950, 96000) ) # 定义调整后的节点顺序 nodes<-data.frame(names=c('Wind', 'Solar', 'Natural Gas', 'Electricity', 'Hydrogen')) # 将名称自动转换为0-based索引 links <- links_named %>% mutate( source = match(source, nodes$names) - 1, target = match(target, nodes$names) - 1 ) p <- sankeyNetwork(Links = links, Nodes = nodes, Source = "source", Target = "target", Value = "value", NodeID = "names", iterations=32, units = "TWh", fontSize = 12, nodeWidth = 30, sinksRight = FALSE) p
修改后桑基图的节点顺序会变为Wind在上、Solar在下,连线交叉问题即可解决。
内容的提问来源于stack exchange,提问作者kalnid
相关产品推荐
相关产品推荐

