forceNetwork не отображает никаких ребер

Я пытаюсь выяснить ТОЧНЫЕ требования к узлам и ссылкам на кадры данных в forceNetwork(), потому что моя сеть отображает цветные подвижные точки без каких-либо ребер, соединяющих их, и я не знаю, почему. Насколько я могу судить, требования следующие:

nodes dataframe must have:

  • a nodeID column (if nodes arent in the same order as the links) that exactly matches the link source name. If they are in the same order this parameter can be dropped according to my reading of the documentation.
  • a group variable which specifies the group of the node. Different groups are different colors to differentiate them.

    links dataframe must have:

  • a source column (list of nodes that will connect with targets)
  • a target column
  • a value column which specifies the weight of the line to draw between the nodes

    > 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()")
    

  • person Rilcon42    schedule 24.05.2015    source источник
    comment
    Похоже, что ваши записи target не содержат имен узлов.   -  person Lars Kotthoff    schedule 24.05.2015
    comment
    @LarsKotthoff, целевыми значениями являются сообщества, они перечислены в самом низу списка моих узлов, который не виден, потому что я отображал только голову. Я обновлю это, когда у меня будет время. Спасибо!   -  person Rilcon42    schedule 26.05.2015
    comment
    Ваши узлы должны быть названы последовательно, 1:n. См. stackoverflow.com/a/30364358/843419.   -  person gregmacfarlane    schedule 12.06.2015
    comment
    Вообще-то, я вижу, ты тот самый парень.   -  person gregmacfarlane    schedule 12.06.2015


    Ответы (1)


    Векторы source и target во фрейме данных Links должны быть числовыми, а их значения относятся к индексу узла во фрейме данных Nodes, который они представляют (с нулевым индексом, в отличие от R, потому что он используется по коду JavaScript).

    Вектор nodeID фрейма данных Nodes дает имя (символьное или числовое) каждого узла, которое отображается при наведении указателя мыши на узел в результирующей визуализации.

    Учитывая данные вашего примера, я подозреваю, что данные, которые у вас есть в links$source, предназначены для идентификатора узлов, а данные, которые у вас есть в links$target, - это что-то еще. Хотя они оба являются числовыми векторами, значения не представляют индекс узла, на который они ссылаются во фрейме данных Nodes.

    Если у вас есть имена/идентификаторы узлов в ваших векторах links$source и links$target вместо индекса узлов в вашем фрейме данных 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);")
    
    person CJ Yetman    schedule 06.04.2018