【发布时间】:2013-04-25 12:18:43
【问题描述】:
我见过在单个页面上创建多个强制布局的解决方案,其中每个布局都包含在自己的 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+")";
});
});
}
}
【问题讨论】:
-
在我看来
tick事件(在某种意义上)是全球性的。也就是说,tick事件只能有一个处理程序,因此您安装的最后一个会被调用。 -
简要介绍了 D3 源代码,这似乎是正在发生的事情。无赖。
标签: layout d3.js force-layout