显示强制图表后禁用强制

时间:2016-11-22 08:12:32

标签: d3.js force-layout

我正在绘制有向图:JSBin。我希望图形最初用力显示,但用户可以自由移动节点。有两种选择,其中任何一种都适合我:

1)显示图表后,我希望能够将任何节点拖动到任何位置,强制不会干预;链接的长度将自动调整

2)一旦显示图表,我希望能够拖动节点,链接的长度可以保持不变,但我不希望强制进行干预自动更改其他节点的位置。

我尝试修改.charge(-300),但它效果不好,有人帮忙吗?

修改1:

我添加了force.nodes([])JSBin,但它没有按预期工作......

2 个答案:

答案 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([]);
});