我见过在单个页面上创建多个强制布局的解决方案,其中每个布局都包含在自己的 SVG 中;但是,我一直无法找到有关如何在单个 SVG 中包含多个力布局的帮助。每个布局都有自己的相关数据。
我目前正在做的一个例子可以在http://jsfiddle.net/connorgr/SRAJa/找到。我已经包含了下面代码的关键部分。最终结果看起来很像除了最后一个节点/链接数据之外的所有数据都没有激活(或删除)强制布局。有什么办法可以防止这种情况发生吗?
由于我正在构建的可视化用例,我无法将数据合并在一起并仅使用一种布局。
/**
* 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+")";
});
});
}
}