我正在绘制有向图:JSBin。我希望图形最初用力显示,但用户可以自由移动节点。有两种选择,其中任何一种都适合我:
1)显示图表后,我希望能够将任何节点拖动到任何位置,强制不会干预;链接的长度将自动调整
2)一旦显示图表,我希望能够拖动节点,链接的长度可以保持不变,但我不希望强制进行干预自动更改其他节点的位置。
我尝试修改.charge(-300)
,但它效果不好,有人帮忙吗?
修改1:
我添加了force.nodes([])
:JSBin,但它没有按预期工作......
答案 0 :(得分:4)
我要解决这个问题:
1)一旦显示图表,我希望能够将任何节点拖到任何位置,力量不会干预;链接的长度将自动调整
首先:
当您将矩形或圆形作为节点时,请为其指定一个类:
var circlesOrRects = svg.append("g").selectAll(".foo")
.data(force.nodes())
.enter()
.append("path")
.attr("class", "foo")//give it a class
在强制定向图停止后,接下来修复节点,如下所示:
var force = d3.layout.force()
.nodes(d3.values(nodes))
.links(links)
.size([width, height])
.linkDistance(150)
.charge(-300)
.on("tick", tick)
.start()
.on("end", function(p) {
//using the class for selecting nodes.
d3.selectAll(".foo").each(function(d){
d.fixed=true;//thsi will fix the node.
});
});
现在强制停止后你可以将你的节点拖到任何地方。
请注意,一旦强制alpha变为0,结束事件将被触发,只有这样才能修复节点。
工作代码here
答案 1 :(得分:0)
要手动停止强制定向图,您只需拨打force.stop()
即可。
您所描述的是在进行任何更改时阻止力重新运行。有几种方法可以做到这一点,我认为最好的方法是从力导向图中“分离”节点。
要执行此操作,只需致电force.nodes([])
即可。现在,力导向图正在使用空图,您可以继续使用节点。要在初始布局后执行此操作,您需要:
force.on("end", function() {
force.nodes([]);
});