代码之家  ›  专栏  ›  技术社区  ›  Chuck C

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

  •  2
  • Chuck C  · 技术社区  · 7 年前

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

    enter image description here

    对于节点,我想将第2列上的B3从右侧移动到第4列(从左侧)。类似地,我想将B4从第2列从右侧移动到第5列从左侧。

    How to tune horizontal 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"
    
          )
    

    提前谢谢!

    1 回复  |  直到 7 年前
        1
  •  1
  •   CJ Yetman    7 年前
    1. 您可以手动调整节点的垂直位置,因此如果将右上角的B11节点拖动到底部,则左上角B1节点的链接线将自动调整到该B1节点的底部。

    2. 实现 the answer to How to tune horizontal node position in 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 + ")"; })