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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:44:53