2

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

在此处输入图像描述

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

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

我的猜测是我需要对源代码进行一些更改并手动放入特定位置。我看到了这篇关于 js How to tune Horizo​​ntal node position in d3 sankeyjs 的帖子,但我不确定在 R 中该怎么做,除了我没有找到任何关于更改边缘位置的帖子。

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

   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"

      )

先感谢您!

4

1 回答 1

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

  2. 为了实现如何在 d3 sankey.js 中调整水平节点位置的答案中描述的内容?,您所要做的就是将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 + ")"; })

于 2017-10-25T11:11:30.477 回答