如何使用 R 在 sankeyNetwork 中自定义节点和边缘位置

how to customize node & edge position in sankeyNetwork using R

networkD3 包中的 sankeyNetwork 大多数时候在定位节点时非常聪明,但有时我想将节点水平放置到另一个位置。 还有其他情况我想垂直移动边缘的起点。以下面的截图为例:

对于节点,我想将右数第2列的B3移动到左数第4列。同样,我想把B4从右数第2列移动到左数第5列。

对于边缘,我想将第一个边缘(B1->B11)的起点移动到B1的低端。

我的猜测是我需要对源代码进行一些更改并手动放入特定位置。我看到这个 post for js ,但我不确定在 R 中该做什么,此外我没有找到任何 post 谈论改变边缘位置。

这里是可复制的数据和代码:

   load(url("https://github.com/bossaround/question/raw/master/sankeyexample.RData"))
      # nn is the node, ee is the edge, now create the link (ll)      
      ll <- inner_join(ee, nn, by = c("N1"="name")) %>%
        rename(source_ID = ID) %>%
        inner_join(nn, by = c("N2"="name")) %>%
        rename(target_ID = ID) 

      # Create Sankey Plot
       sankeyNetwork(
        Links = ll,
        Nodes = nn,
        Source = "source_ID",
        Target = "target_ID",
        Value = "Value",
        NodeID = "newname",
        fontSize = 12,
        nodeWidth = 40,
        nodePadding = 20,
        NodeGroup = "newname"

      )

提前致谢!

  1. 您可以手动调整节点的垂直位置,因此如果将右上角的 B11 节点拖到底部,左上角的 B1 节点的 link 线将自动调整调整到那个B1节点的底部。

  2. 要实现 中描述的内容,您所要做的就是将 sinksRight = FALSE 参数添加到 sankeyNetwork() 调用中,但我不认为实现你真正想要的。

  3. 目前无法手动调整节点的水平位置。在代码中单独调整它们会非常乏味,但是您可以在加载后向 运行 添加额外的 JS,以使用一些复杂的 JS 代码(例如 d3.selectAll(".node").filter(function(d) { return d.name == "B3" }).attr("transform", function(d) { return "translate(" + (d.x - 300) + "," + d.y + ")"; })

    [ 单独调整特定节点的位置。 =24=]