【问题标题】:Multiple networks in 1 graph from networkD3's forceNetwork来自 networkD3 的 forceNetwork 的 1 个图中的多个网络
【发布时间】:2018-12-28 07:20:19
【问题描述】:

是否可以通过将 forceNetwork 用于 networkD3 将多个网络绘制到 1 个图中?

一个示例(来自Adjust background picture and title for plot from networkD3's forceNetwork 的帖子)使用一组节点 + 边(即 subNodes 和 subLinkList)。在有 4 组节点 + 边的情况下,我想将它们全部放入 1 个图中。怎么可能?

谢谢。

一组节点+边的图如下:

library(networkD3)
library(htmlwidgets)

subNodes <- 
  read.table(stringsAsFactors = FALSE, header = TRUE, text = "
             nodeName nodeGroup     nodeSize
             Bob      NorthAmerica  10
             Alice    NorthAmerica  10
             Tom      China         10
             John     Japan         10
             ")

subLinkList <-
  read.table(stringsAsFactors = FALSE, header = TRUE, text = "
             root  children  linkValue
             0     1         1
             0     2         1
             0     3         1
             ")

network <- forceNetwork(Links = subLinkList, Nodes = subNodes,
                        Source = "root", Target = "children",
                        Value = "linkValue", NodeID = "nodeName",
                        Group = "nodeGroup", 
                        opacity = 1, Nodesize = "nodeSize",
                        legend = TRUE)

network <- htmlwidgets::prependContent(network, htmltools::tags$h1("Title"))

network <- htmlwidgets::onRender(
  network,
  'function(el, x) { 
    d3.selectAll(".legend text").style("fill", "white");
    d3.select("body").style("background-color", "#144370");
    d3.select("h1").style("color", "red").style("font-family", "sans-serif");
    d3.select("body")
      .style("background-repeat", "no-repeat")
      .style("background-position", "right bottom");
  }'
)


network

【问题讨论】:

    标签: javascript r d3.js htmlwidgets networkd3


    【解决方案1】:

    我相信这就是你想要的。

    只需使用 dplyr 中的函数 bind_rows 来合并你的节点集 + 边

    library(networkD3)
    library(htmlwidgets)
    library(dplyr)
    
    subNodes <- 
      read.table(stringsAsFactors = FALSE, header = TRUE, text = "
                 nodeName nodeGroup     nodeSize
                 Bob      NorthAmerica  10
                 Alice    NorthAmerica  10
                 Tom      China         10
                 John     Japan         10
                 ")
    
    subLinkList <-
      read.table(stringsAsFactors = FALSE, header = TRUE, text = "
                 root  children  linkValue
                 0     1         1
                 0     2         1
                 0     3         1
                ")
    
    subNodes2 <- 
      read.table(stringsAsFactors = FALSE, header = TRUE, text = "
                 nodeName nodeGroup     nodeSize
                 A        Brazil        10
                 B        NorthAmerica  10
                 C        China         10
                 D        Japan         10
                 ")
    
    subLinkList2 <-
      read.table(stringsAsFactors = FALSE, header = TRUE, text = "
                root  children  linkValue
                 4     5         1
                 4     6         1
                 4     7         1
                 ")
    
    subNodes3 <- 
      read.table(stringsAsFactors = FALSE, header = TRUE, text = "
                 nodeName nodeGroup     nodeSize
                 E        Brazil        10
                 F        NorthAmerica  10
                 G        China         10
                 H        Japan         10
                 ")
    
    subLinkList3 <-
      read.table(stringsAsFactors = FALSE, header = TRUE, text = "
                 root  children  linkValue
                 8     9         1
                 8     10        1
                 8     11        1
                 ")
    
    
    subNodes4 <- 
      read.table(stringsAsFactors = FALSE, header = TRUE, text = "
                 nodeName nodeGroup     nodeSize
                 I        Brazil        10
                 J        NorthAmerica  10
                 K        China         10
                 L        Japan         10
                 ")
    
    subLinkList4 <-
      read.table(stringsAsFactors = FALSE, header = TRUE, text = "
                root  children  linkValue
                12    13        1
                12    14        1
                12    15        1
                ")
    
    
    subNodesFinal <- bind_rows(subNodes, subNodes2, subNodes3, subNodes4)
    subLinkListFinal <- bind_rows(subLinkList, subLinkList2, subLinkList3, 
                                  subLinkList4)
    
    network <- forceNetwork(Links = subLinkListFinal, Nodes = subNodesFinal,
                            Source = "root", Target = "children",
                            Value = "linkValue", NodeID = "nodeName",
                            Group = "nodeGroup", 
                            opacity = 1, Nodesize = "nodeSize",
                            legend = TRUE)
    
    network <- htmlwidgets::prependContent(network, htmltools::tags$h1("Title"))
    
    network <- htmlwidgets::onRender(
      network,
      'function(el, x) { 
        d3.selectAll(".legend text").style("fill", "white");
        d3.select("body").style("background-color", "#144370");
        d3.select("h1").style("color", "red").style("font-family", "sans-serif");
        d3.select("body")
          .style("background-repeat", "no-repeat")
          .style("background-position", "right bottom");
      }'
    )
    
    
    network
    

    【讨论】:

    • 最好指出组合链接列表中的索引号可能需要适应组合节点列表。
    • @Wincius_Sabino,这是一个很好的答案!看起来这 4 个图表是随机放在一起的。有没有办法区分#1、#2、#3和#4?谢谢。
    • @MarkK,我正在尝试解决区分 4 个图表的类似任务,有没有办法放置 2 个或更多图例?
    • @CJYetman,在将多个网络绘制在一起时,networkd3 是否可以有多个图例和着色模式?
    • 不,这在内置功能中是不可能的
    猜你喜欢
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多