2012-07-06 4 views
17

I Einstellung versucht, beide Knoten und Verbindungen zur gleichen Zeit auf diese Weise:d3.js: „Can not Eigenschaft‚Gewicht‘undefiniert lesen“, wenn manuell beide Knoten und Verbindungen für Kraft Layout definiert

var force = d3.layout.force() 
    .size([w, h]) 
    .nodes(nodes) 
    .links(connections) 
    .start(); 

nodes = [{"name":"data_base_id", "kind":"subgenre"},...] 
connections = [{"source":"name_of_node", "target":"name_of_other_node"},...] 

Ich habe Daten, die möglicherweise keine Verbindungen haben, daher müssen die Knoten definiert werden, damit alle Knoten gerendert werden. Die Definition der Genres ist ziemlich einfach. aber ich bekomme diesen Fehler;

Cannot read property 'weight' of undefined 

Und wenn ich auf Kommentar .links (Verbindungen) der Graph macht (ragt ein Bündel von Punkten verstreut ...) Wie erhalte ich die Verbindungen/Links mit d3 zu kooperieren?

Ich habe die Dokumente gelesen, und anscheinend müssen die Quelle und das Ziel INDEXES der Knoten im Knoten-Array sein. Gibt es das irgendwie, um das zu ändern? Also kann ich den Namen eines Knotens anstelle des Indexes in einem Array verwenden?

Antwort

8

Das force-directed Layout verwendet Kantengewichte, um das Layout zu berechnen. Versuchen Sie, einen Dummy "weight":1 zu all Ihren Verbindungen hinzuzufügen.

Der Code, der die Links initialisiert das wie folgt aussieht:

links.forEach(function(d) { 
    if (typeof d.source == "number") { d.source = nodes[d.source]; } 
    if (typeof d.target == "number") { d.target = nodes[d.target]; } 
}); 

Vermutlich könnten Sie zwicken, dass (in der d3-Quelle) jede Eigenschaft/Typ zu verwenden.

4

Ich denke, Sie haben möglicherweise Null-Werte in Ihrer Quelle und Ziel. Ich hatte auch diesen Fehler und behob ihn durch Ausfiltern der Nullwerte.

16

Ich begegne demselben Problem vor, es liegt daran, dass es Null-Werte in Quelle/Ziel von Links gibt. Ausdruck Knoten und Links Informationen könnten

1

debuggen helfen, wie ich dieses Problem in einer Reihe von Möglichkeiten Pop-up hätte. In jüngster Zeit hat ich meine Kantenliste hatte, wie folgt:

{Source: 0; Target: 1} 

statt:

{source: 0, target: 1} 
10

Zusätzlich zu den Antworten, die Null in der Quelle/Ziel von Links zu nennen, könnte der Grund dafür sein, die Zuweisung einer Quelle/eines Ziels außerhalb des Bereichs. Z.B. Sie haben 10 Knoten und weisen das Ziel dem 11. Indexknoten zu.

+0

ich dieses Problem habe, wie gehe ich über den Fehler nicht zu werfen, wenn ich nicht den Knoten in meinen Daten finden kann? – thatOneGuy

+0

Wie @air_bob sagte, können Sie ausdrucken, wenn eine Link-Zuweisung über die Anzahl der Knoten hinausgeht. – elachell

+0

Wichtiger Vorbehalt: JavaScript ist 0 indiziert. Also ich glaube, der richtige Kommentar ist ".. Sie haben 10 Knoten und weisen das Ziel (oder die Quelle) zu den 10. indizierten Knoten" – JHowIX

9

Dank der obigen Antworten beziehen sich auf Null-Quelle oder Zielwerte!

Ich habe das Diagramm aus http://bl.ocks.org/mbostock/4062045 getestet und festgestellt, dass meine Daten einen fehlenden Knoten referenzierten.

Dies kann andere dieses Problem zu debuggen helfen:

d3.json("my-buggy-data.json", function(error, graph) { 

    // Find blank links, which give the error 
    // "Uncaught TypeError: Cannot read property 'weight' of undefined" 
    graph.links.forEach(function(link, index, list) { 
     if (typeof graph.nodes[link.source] === 'undefined') { 
      console.log('undefined source', link); 
     } 
     if (typeof graph.nodes[link.target] === 'undefined') { 
      console.log('undefined target', link); 
     } 
    }); 

    force 
     .nodes(graph.nodes) 
     .links(graph.links) 
     .start(); 
+1

Dies löst mein Problem, Danke! –

Verwandte Themen