Widziałem rozwiązania do tworzenia wielu układów sił na jednej stronie, gdzie każdy układ jest zawarty we własnym SVG; jednak nie udało mi się znaleźć pomocy dotyczącej uwzględniania wielu układów sił w jednym pliku SVG. Każdy układ ma przypisane własne dane.D3: Wiele układów sił w jednym SVG?
Przykład tego, co obecnie robię, można znaleźć pod adresem http://jsfiddle.net/connorgr/SRAJa/. Dołączyłem kluczową część poniższego kodu. Wynik końcowy wygląda bardzo podobnie, ponieważ układ siły nigdy nie został aktywowany (lub usunięty) dla wszystkich, oprócz danych ostatniego węzła/łącza. Czy istnieje sposób, aby temu zapobiec?
Nie mogę scalić danych razem i użyć tylko jednego układu ze względu na przypadek użycia wizualizacji, którą buduję.
/**
* 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+")";
});
});
}
}
Wydaje mi się, że wydarzenie "tick" jest (w pewnym sensie) globalne. Oznacza to, że możesz mieć tylko jeden moduł obsługi dla zdarzenia "tick", więc ostatni, który instalujesz zostanie wywołany. –
Zrobiłem krótkie zanurzenie w kodzie źródłowym D3 i wydaje się, że to właśnie się dzieje. Bummer. –