如何强制 networkD3::sankeyNetwork() 重复节点而不是绕回同一节点

How to force networkD3::sankeyNetwork() to repeat nodes rather than circling back to same node

您好,我正在创建桑基图来显示迁移。我面临的一个方面是如何处理状态没有改变的情况,即没有发生迁移。 在这种情况下,sankey 绕回同一个源,创建一个圆而不是使用 'source- target' 布局,其中两个源目的地是分开的。 我想看类似

的内容

而不是跟随我现在看到的

以下是一个可重现的示例 - 感谢您对此提供的任何帮助

library(networkD3)
library(dplyr)
links<-data.frame(
  source=c('One','Two','Two','Three','Three','Four','Four','Five','Five','Six'),
  target=c('Two','Two','Three','Three','Four','Four','Five','Five','Six','Seven'),
  value=c(78,108,27,14,31,38,17,76,10,89)
)
nodes <- data.frame(
  name=c(as.character(links$source), 
         as.character(links$target)) %>% unique()
)
links$IDsource <- match(links$source, nodes$name)-1 
links$IDtarget <- match(links$target, nodes$name)-1

sankeyNetwork(Links = links, Nodes = nodes,
              Source = "IDsource", Target = "IDtarget",
              Value = "value", NodeID = "name", 
              fontSize = 20)

您希望在图中看到的每个节点都必须在您的节点中唯一标识 data.frame。如果您希望一些唯一节点共享相同的标签,您可以为标签添加一列到节点 data.frame 并将其指定给 NodeID 参数......这些不需要是唯一的。

library(networkD3)

links <- read.csv(header = TRUE, strip.white = TRUE, text ="
source,    target,    value
One_1,     Two_2,     78
Two_2,     Two_3,     108
Two_2,     Three_3,   27
Three_3,   Three_4,   14
Three_3,   Four_4,    31
Four_4,    Four_5,    38
Four_4,    Five_5,    17
Five_5,    Five_6,    76
Five_5,    Six_6,     10
Six_6,     Seven_7,   89
")

id <- unique(c(as.character(links$source), as.character(links$target)))
label <- sub("_[0-9]", "", id)
nodes <- data.frame(id = id, label = label)

links$IDsource <- match(links$source, nodes$id)-1 
links$IDtarget <- match(links$target, nodes$id)-1

sankeyNetwork(Links = links, Nodes = nodes,
              Source = "IDsource", Target = "IDtarget",
              Value = "value", NodeID = "label", 
              fontSize = 20)