Ich habe Lösungen zum Erstellen mehrerer Force-Layouts auf einer einzelnen Seite gesehen, wobei jedes Layout in einer eigenen SVG enthalten ist. Ich konnte jedoch keine Hilfe finden, wie mehrere Force-Layouts in ein einzelnes SVG integriert werden können. Jedem Layout sind eigene Daten zugeordnet.D3: Mehrere Force-Layouts in einem SVG?
Ein Beispiel für das, was ich gerade mache, finden Sie unter http://jsfiddle.net/connorgr/SRAJa/. Ich habe den wichtigsten Teil des Codes unten eingefügt. Das Endergebnis sieht sehr ähnlich aus wie das Force-Layout wurde nie für alle außer den letzten Knoten/Link-Daten aktiviert (oder gelöscht). Gibt es eine Möglichkeit, dies zu verhindern?
Ich bin nicht in der Lage, die Daten zusammenzuführen und nur ein Layout wegen des Anwendungsfalls für die Visualisierung zu verwenden, die ich erstelle.
/**
* Creates a force layout in svgObj for each element in graphs
* (svg) svgObj - The SVG to include the force layouts in
* (json) graphs - An array of {"nodes":[...],"links":[...]} objects
*/
function generateMultiForce(svgObj, graphs) {
for(var i=0; i < graphs.length; i++) {
var graph = graphs[i];
var graphArea = svgObj.append("g");
var force = d3.layout.force()
.charge(-200)
.linkDistance(45)
.size([width, height])
.nodes(graph.nodes)
.links(graph.links)
.start();
var link = graphArea.selectAll(".link")
.data(graph.links)
.enter().append("line")
.attr("class", "link");
var nodeGroup = graphArea.selectAll("g")
.data(graph.nodes)
.enter().append("g")
.call(force.drag);
var node = nodeGroup.append("circle")
.attr("class", "node")
.attr("r", 5)
.style("fill", function(d) {
return color(d.group); });
var text = nodeGroup.append("text")
.attr("x", 8)
.attr("y", ".31em")
.text(function(d) { return d.name; });
force.on("tick", function() {
link
.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
nodeGroup.attr("transform", function(d) {
return "translate("+d.x+","+d.y+")";
});
});
}
}
Es sieht für mich so aus, als wäre das 'tick'-Ereignis (in gewissem Sinne) global. Das heißt, Sie können nur einen Handler für ein "tick" -Ereignis haben, sodass der letzte, den Sie installieren, aufgerufen wird. –
Ein kurzer Tauchgang in den D3-Quellcode, und das scheint zu sein. Bummel. –