使用R的networkD3包创建桑基图时遇到的问题及代码求助
桑基图问题修正方案
核心问题分析
你的代码存在两个关键问题:
- 节点与连接索引不匹配:
nodes虽然列出了三列节点,但links中第二层的NA节点(索引5)没有收到任何流入流量,导致无法显示;同时第三层节点(索引6-8)完全未被使用,自然不会出现。 - 反向连接导致环形:如果出现后层级节点指向前面层级的连接(比如第二层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
相关产品推荐
相关产品推荐

