1

我试图找出 forceNetwork() 中节点和链接数据帧的确切要求,因为我的网络显示彩色可移动点而没有任何边缘连接它们,我不知道为什么。据我所知,要求是:

节点数据框必须具有:

  • 与链接源名称完全匹配的 nodeID 列(如果节点与链接的顺序不同)。如果它们的顺序相同,则可以根据我对文档的阅读删除此参数。
  • 一个组变量,它指定节点的组。不同的组用不同的颜色来区分它们。

    链接数据框必须具有:

  • 源列(将与目标连接的节点列表)
  • 目标列
  • 一个值列,它指定要在节点之间绘制的线的权重

    > head(links)
      source target value
    1  11170      7     1
    2   2840      2     1
    3  32595      2     1
    4  45410      8     1
    5  52720     12     1
    6  61720      6     1
    > head(nodes)
      nodeID group
    1  11170     2
    2   2840     1
    3  32595     2
    4  45410     3
    5  52720     1
    6  61720     2
    > head(E(g))
    Edge sequence:
    
    [1] 7     -- 11170
    [2] 2     -- 2840 
    [3] 2     -- 32595
    [4] 8     -- 45410
    [5] 12    -- 52720
    [6] 6     -- 61720
    > head(V(g))
    Vertex sequence:
    [1] "11170" "2840"  "32595" "45410" "52720" "61720"
    
    > typeof(nodes$nodeID[1])
    [1] "integer"
    > typeof(links$source[1])
    [1] "integer"
    
    > dim(links)
    [1] 121   3
    > dim(nodes)
    [1] 135   2
    
    > forceNetwork(Links = links, Nodes = nodes,Source = "source", Target = "target", NodeID = "nodeID",Group = "group", opacity = 0.8, colourScale = "d3.scale.category10()")
    
  • 4

    1 回答 1

    0

    数据框中的source target向量Links必须是数字,并且它们的值是指Nodes它们所代表的数据框中节点的索引(零索引,与 R 不同,因为它被 JavaScript 代码使用)。

    数据框的nodeID向量Nodes给出了每个节点的名称(字符或数字),当您将鼠标悬停在生成的可视化中的某个节点上时会显示该名称。

    鉴于您的示例数据,我怀疑您拥有的数据links$source是节点的 ID,而您拥有的数据links$target是别的东西。虽然它们都是数字向量,但这些值并不代表它们在Nodes数据框中引用的节点的索引。

    如果您的links$sourcelinks$target向量中有节点名称/ID,而不是数据框中节点的索引Nodes,您可以像这样修复它......

    links <- read.table(header = T, text = "
    source target value
    11170      7     1
    2840       2     1
    32595      2     1
    45410      8     1
    52720     12     1
    61720      6     1
    ")
    
    nodes <- read.table(header = T, text = "
    nodeID group
    11170     2
    2840      1
    32595     2
    45410     3
    52720     1
    61720     2
    ")
    
    # build a new Nodes data frame that includes every 
    # unique node found in links$source and links$target
    nodes_complete <- data.frame(nodeID = unique(c(links$source, links$target)))
    
    # add groups already identified in your original Nodes data frame
    nodes_complete$group <- nodes$group[match(nodes_complete$nodeID, nodes$nodeID)]
    
    # convert your links$source and links$target nodes to their index
    # in the new Nodes data frame (zero-indexed)
    links$source <- match(links$source, nodes_complete$nodeID) - 1
    links$target <- match(links$target, nodes_complete$nodeID) - 1
    
    # now the forceNetwork function will run as expected
    library(networkD3)
    forceNetwork(Links = links, Nodes = nodes_complete, Source = "source", 
                 Target = "target", NodeID = "nodeID", Group = "group", 
                 opacity = 0.8, 
                 colourScale = "d3.scaleOrdinal(d3.schemeCategory10);")
    
    于 2018-04-06T09:42:57.577 回答