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

使用R的networkD3包创建桑基图时遇到的问题及代码求助

桑基图问题修正方案

核心问题分析

你的代码存在两个关键问题:

  1. 节点与连接索引不匹配:nodes虽然列出了三列节点,但links中第二层的NA节点(索引5)没有收到任何流入流量,导致无法显示;同时第三层节点(索引6-8)完全未被使用,自然不会出现。
  2. 反向连接导致环形:如果出现后层级节点指向前面层级的连接(比如第二层NA指向第一层NA),就会形成异常环形,这是因为桑基图默认按连接关系排列节点,反向连接会打乱层级顺序。

修正后的代码

library(networkD3)

# 定义三列节点,每列3个,共9个独立节点(名称可重复,但属于不同层级)
nodes <- data.frame(name = c("Asia", "Europe", "NA",  # 第一列
                             "Asia", "Europe", "NA",  # 第二列
                             "Asia", "Europe", "NA")) # 第三列

# 构建层级间的连接:第一列→第二列,第二列→第三列
links <- data.frame(
  source = c(0, 0, 0, 1, 1, 1, 2, 2, 2,  # 第一列节点索引0-2
             3, 3, 3, 4, 4, 4, 5, 5, 5), # 第二列节点索引3-5
  target = c(3, 4, 5, 3, 4, 5, 3, 4, 5,  # 对应第二列节点索引3-5
             6, 7, 8, 6, 7, 8, 6, 7, 8), # 对应第三列节点索引6-8
  value = c(2, 3, 1, 1, 2, 0, 4, 3, 2,    # 第一到第二列的流量
            4, 0, 0, 0, 4, 0, 0, 0, 1)    # 第二到第三列的流量
)

# 创建桑基图,sinksRight=FALSE确保节点按层级从左到右排列
sankey <- sankeyNetwork(Links = links, Nodes = nodes, 
                        Source = "source", Target = "target", Value = "value",
                        units = "TWh", fontSize = 12, nodeWidth = 30,
                        sinksRight = FALSE)

print(sankey)

关键修正点

  • 节点唯一性:即使节点名称相同,不同层级的节点需要作为独立条目放在nodes中,对应唯一索引。
  • 层级流向控制:所有连接必须从左到右(前层级→后层级),禁止反向连接,避免出现环形。
  • 流量完整性:确保每个需要显示的节点都有流入或流出流量(value不为0),否则节点会被隐藏。
  • 层级排列:添加sinksRight=FALSE参数,强制节点按连接顺序排列,保证三列依次显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:50:31