How to sort source and/or target nodes in a sankey diagram within a shiny app?

末鹿安然 提交于 2019-12-07 08:30:46

问题


I have a simple sankey diagram, generated using networkD3 package inside a shiny app. How can source and/or target nodes be sorted?

As you can see in the MWE, by default, neither source nodes (A, B, C, D, E) nor target nodes (V, W, X, Y, Z) are sorted. At least, sorting is not comprehensible to me.

Code:

library("shiny")
library("networkD3")

ui <- fluidPage(
  column(3),
  column(6, sankeyNetworkOutput("mySankeyD")),
  column(3)
)

server <- function(input, output) {
  output$mySankeyD <- renderSankeyNetwork({
    myDf <- list(
      nodes=data.frame(name=c( "A", "B", "C", "D", "E",
                               "V", "W", "X", "Y", "Z")),
      links=data.frame(source=as.integer(c(0, 1, 2, 3, 3, 4, 4)),
                       target=as.integer(c(7, 6, 7, 8, 7, 5, 9)),
                       value =           c(1, 4, 1, 5, 1, 5, 3)
      )
    )

    sankeyNetwork(Links = myDf$links, Nodes = myDf$nodes, Source = "source",
                  Target = "target", Value = "value", NodeID = "name",
                  units = "TWh", fontSize = 25, nodeWidth = 30, fontFamily = "sans-serif", iterations = 30)
  })
}

shinyApp(ui, server)

How does sankeyNetwork() determine the order of nodes? Is it possible to sort them alphabetically?

I'd like to have sorted source nodes, if possible also sorted target nodes.

EDIT As @emilliman5 pointed out in the comment, it is no possible to sort the nodes manually.

Thus, are there other R packages out there to generate sankey diagrams that allow sorting of nodes? If yes, how to do so?


回答1:


Setting iterations = 0 inside sankeyNetwork() did the trick. Now nodes are plotted the same order as in the nodes dataframe.

library("networkD3")

myDf <- list(
    nodes=data.frame(name=c( "A", "B", "C", "D", "E",
                             "V", "W", "X", "Y", "Z")),
    links=data.frame(source=as.integer(c(0, 1, 2, 3, 3, 4, 4)),
                     target=as.integer(c(7, 6, 7, 8, 7, 5, 9)),
                     value =           c(1, 4, 1, 5, 1, 5, 3)
    )
)

sankeyNetwork(Links = myDf$links, Nodes = myDf$nodes, Source = "source",
              Target = "target", Value = "value", NodeID = "name",
              units = "TWh", fontSize = 25, nodeWidth = 30, 
              fontFamily = "sans-serif", iterations = 0)


来源:https://stackoverflow.com/questions/46164391/how-to-sort-source-and-or-target-nodes-in-a-sankey-diagram-within-a-shiny-app

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!