2017-05-12 3 views
2

Vielen Dank für Ihre Hilfe.Warum zeigt ForceNetwork in Netzwerkd3 R alle Knoten an, die nicht in der Kantenliste enthalten sind?

Ich bin mit dem networkd3 Paket in R einen forceNetwork Plot eines Nodelist und Links (Kantenliste) zu zeichnen.

Ich habe eine Kantenliste/Linkliste:

> edgelist 

     round_prob NODEAid NODEBid 
33979  0.6245 6990 6588 
4899  0.9797 1042 1041 
37109  0.6046 7498 7531 
27771  0.7144 5906 16029 
3603  0.6452  783  804 
28491  0.6078 6034 5862 
4518  0.6245  962 9874 
19613  0.6745 4121 10285 
19916  0.8721 4179 4180 
8249  0.6821 1737 1733 
35389  0.7150 7145 16992 
32010  0.6495 6728 16921 
22553  0.6959 4722 4549 
14996  0.6031 3273 12929 
35927  0.6245 7221 9814 
15349  0.6245 3337 3233 
34833  0.6109 7085 6852 
39044  0.6117 7936 7977 
39075  0.6844 7944 10978 
11691  0.6821 2572 2587 

Dies ist ein Beispiel einer viel größeren Kantenliste, wo ich nur die Links mit Link Wahrscheinlichkeit> 0,6 und < 1. Die volle Kantenliste ausgewählt wurde Null indexiert, bevor die Probe genommen wurde.

Ich habe auch eine Nodelist, das ist 18000 Zeilen lang. dies Eine Probe davon ist:

> head(nodes) 

    node id gr 
0 1097 0 1 
1 1149 1 1 
2 1150 2 1 
3 3395 3 1 
4 3396 4 1 
5 3523 5 1 

Ich versuche forceNetwork zu plotten mit:

forceNetwork(Links = edgelist, Nodes = nodes, Source = "NODEAid", 
      Target = "NODEBid", Value = "round_prob", NodeID = "node", 
      Group = "gr", opacity = 0.9) 

Dieses diesen Plan gibt, vor ein-:

enter image description here

Problem: Ich habe nur habe 20 Paare von Knoten, aber meine Handlung hat Tausende mehr (ich kann die Zahl nicht zurückgeben).

Durch Schweben über die nicht verbundenen Punkte konnte ich feststellen, dass sie aus allen möglichen Knoten bestehen, die in der Nodelist enthalten sind.

Grundsätzlich denke ich, dass forceNetwork jeden möglichen Knoten plotten, auch diejenigen, die nicht in der Edgeliste sind.

Warum passiert das und wie kann ich damit aufhören?


Per dieser Frage Going crazy with forceNetwork in R: no edges displayed Ich stellte sicher, dass alle meine Daten im numerischen Format und Null indiziert war. Ich erhalte immer noch diesen Fehler.

Hinweis: Wenn ich das forceNetwork-Beispiel in dieser Frage How to plot a directed Graph in R with networkD3? ausführen und von diesem Lernprogramm https://christophergandrud.github.io/networkD3/ ist die Ausgabe wie erwartet.

Antwort

2

Ich würde vorschlagen, entweder simpleNetwork verwenden, die automatisch die Knotenliste erstellt Ihnen auf der Grundlage der Kantenliste übergeben, oder einen ähnlichen Code verwenden, wie simpleNetwork ist Ihre Knotenliste zuerst zu erstellen und dann das passieren zu forceNetwork ...

edgelist <- read.table(header = T, text = " 
round_prob NODEAid NODEBid 
33979  0.6245 6990 6588 
4899  0.9797 1042 1041 
37109  0.6046 7498 7531 
27771  0.7144 5906 16029 
3603  0.6452  783  804 
28491  0.6078 6034 5862 
4518  0.6245  962 9874 
19613  0.6745 4121 10285 
19916  0.8721 4179 4180 
8249  0.6821 1737 1733 
35389  0.7150 7145 16992 
32010  0.6495 6728 16921 
22553  0.6959 4722 4549 
14996  0.6031 3273 12929 
35927  0.6245 7221 9814 
15349  0.6245 3337 3233 
34833  0.6109 7085 6852 
39044  0.6117 7936 7977 
39075  0.6844 7944 10978 
11691  0.6821 2572 2587 
") 

library(networkD3) 

simpleNetwork(edgelist, Source = 'NODEAid', Target = 'NODEBid') 

sources <- edgelist$NODEAid 
targets <- edgelist$NODEBid 
node_names <- factor(sort(unique(c(as.character(sources), 
            as.character(targets))))) 
nodes <- data.frame(name = node_names, group = 1, size = 8) 
links <- data.frame(source = match(sources, node_names) - 1, 
       target = match(targets, node_names) - 1, 
       value = edgelist$round_prob) 

forceNetwork(Links = links, Nodes = nodes, Source = "source", 
      Target = "target", Value = "value", NodeID = "name", 
      Group = "group", opacity = 0.9) 
+1

er Code (nach simpleNetwork) tut, was benötigt wird. Und Sie haben Recht, dass die Lösung wäre, Ihre Knotenliste zuerst basierend auf der von Ihnen übergebenen Kantenliste zu erstellen und dann beide an "forceNetwork" zu übergeben. Nur ein Nigger. Auf 'simpleNetwork (Edgeliste)' becase ist das df nicht in der Reihenfolge, in der es erwartet wird, dass es das Diagramm etwas falsch anzeigt. – Mamonu

+1

Ich habe den Befehl 'simpleNetwork' im obigen Code geändert ... Sie können die Spaltennamen für Quelle und Ziel explizit festlegen. –

+0

@CJYetman Arbeitete wie ein Zauber - vielen Dank für Ihre Hilfe :) So wird der Index von 'nodes' (der, nachdem er die ursprünglichen 4-stelligen Knoten-IDs bestellt hat, auf Null zurückgesetzt wird) verwendet, um die' source' und 'zu codieren Ziel-IDs. Also sollten die Werte in 'source' in' target' mit der reset-id auf 'nodes' übereinstimmen, * not * (in diesem Fall) die ursprünglichen 4-stelligen IDs, die von der Abtastung der Originaldaten übrig geblieben sind? – Chuck

2

Ich würde denken, dass Sie die Knotenliste so unterteilen sollten, dass sie nur Knoten enthält, die sich in der Kantenliste befinden.

+0

Hallo Christopher. Herzlichen Dank für Ihre Antwort. Also habe ich das versucht und es hat nicht funktioniert. Was ich jedoch nicht getan habe, war den Index für die Knotenliste von Edgelist nachher zurückzusetzen (dh ich habe eine Teilmenge von beiden, die die ursprünglichen IDs '1097 1149 ...' hat, muss ich diese IDs wieder aus setzen 0 vielleicht. Ich werde mich damit neu einfinden und zu dir zurückkommen. Mein aufrichtiger Dank an dich. – Chuck

+0

Hallo Christopher, dank @CJYetman konnte ich das zur Arbeit bringen. Ich denke, wenn er nicht geantwortet hätte, würde dein Vorschlag es tun Auch das ist gut gelungen, vielen Dank für Ihre Antwort und das Schreiben dieses Pakets.Einen schönen Tag :) – Chuck

Verwandte Themen