D3在直边和多个弯曲边缘之间切换

时间:2017-12-27 19:10:17

标签: d3.js graph force-layout

我有一个类似于this example中的D3力图,除了在一对节点节点之间可以有多于2个边。我希望能够在可视化所有边缘和仅一个直边缘之间切换。我通过简单地改变边缘的可见性(隐藏或可见)来实现这一点,但是节点之间有很多边缘存在可见的滞后。

我想解决的问题是只在直边上运行力模拟,而不是包括所有弯曲边。这会将边缘限制为每对节点的一个边缘,从而使力模拟算法不那么密集。

是否可以在仍然能够渲染强制算法中未使用的弯曲边缘的情况下执行此操作?

1 个答案:

答案 0 :(得分:0)

当代码计算如何绘制所有路径时,看起来最大的计算boggleneck实际上来自.on("tick", tickActions)步骤,即使是那些不可见的路径。

对于任何有兴趣的人,我更改了tick actions函数,首先检查type变量,然后再绘制边缘:

function tickActions() {
    // plot the curved links
    link.attr("d", function(d) {
        if (d.type != draw_type) return null;

        // code to draw paths

    });
}

通过更改draw_type变量,您可以决定实际计算和绘制哪些边。

除此之外,您还需要忽略某些边缘的强度。我知道我希望我的图表仅基于直边间隔,所以我对simulation.force('link', link_force)属性执行了以下操作:

var link_force = d3.forceLink()

    // code for .id and .distance attributes

    // return 0 for all non
    .strength(function(d) {
        if (d.type != 'straight') return 0;
        return 0.3;
    });

通过将所有非直边的强度设置为0,强制算法在间隔节点时基本上忽略它们。

最后,我添加了restart_network()函数来更新图表。可以使用此函数来更改图表看到的实际链接数据,但我还决定包含其他更改。

function restart_network() {
    simulation.force("link", link_force);
    simulation.alpha(1).restart();
}