1つのページに複数のフォースレイアウトを作成するソリューションがあります。各レイアウトはそれぞれのSVGに含まれています。しかし、私は単一のSVG内に複数のフォースレイアウトを含める方法についてのヘルプを見つけることができませんでした。各レイアウトには独自のデータが関連付けられています。D3:1つのSVGに複数のレイアウトがありますか?
私が現在行っていることの例は、http://jsfiddle.net/connorgr/SRAJa/にあります。私は以下のコードの重要な部分を含んでいます。最終的な結果は、最後のノード/リンクデータを除いて、フォースレイアウトが決してアクティブ化(または削除)されなかったようなものです。これが起こらないようにする方法はありますか?
ビルドしている視覚化のユースケースのため、データをまとめて1つのレイアウトしか使用できません。
/**
* 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+")";
});
});
}
}
「ティック」イベントが(ある意味で)グローバルであるように見えます。つまり、 'tick'イベントに対してハンドラを1つしか持てないので、最後にインストールしたものが呼び出されます。 –
D3のソースコードに簡単に飛び込んできましたが、これは何が起きているように見えます。バマー。 –