d3.js linkStrength 对力图中 linkDistance 的影响

d3.js linkStrength influence on linkDistance in a force graph

我正在制作图表以显示不同节点之间的关系。节点越相关(根据业务逻辑),节点之间的距离应该越近。

我注意到一些与 .1linkStrength 的链接 更短 (这就是我想要实现的)和其他一些相同的链接强度 1linkStength。从有关强制布局参数的文档中,我现在找到了这句话:

The default linkStrength value is 1.0, which maintains the full effect of linkDistance. By setting the value of linkStrength less than 1, though, the distance constraint can be relaxed.

这是否意味着如果我将 linkDistance 设置为 150linkStrength(1.0) 的链接将比 linkStrength(.1) 的链接更接近 150?如果是,它们是否需要更短、更长或根本无关紧要?因为我对布局感到有点惊讶。

link 强度设置 link 的刚度,而不是节点之间的距离 (force layout doc)。节点之间的距离由它们的电荷控制。您可以像这样使节点动态充电:

var force = d3.layout.force()
        .nodes(nodes)
        .theta(0.1)
        .charge(function (d) {
            return -(d.radius * d.radius * 0.125);
        })
        .gravity(0.1)
        .size([width, height])
        .on("tick", tick)
        .start();

使用此技术的工作示例:vizz.ly

长话短说:当使用 D3 的强制布局时,没有内置的方法来强制执行 link 的固定长度。力布局本质上是动态的,force.linkDistance() and force.linkStrength() 的设置值只是将另一个力引入到每次迭代中执行的计算集,即每个 tick,而力布局是 运行。

每个tick上计算了三个力:

1. Link length. The first force to be calculated is the adjustment for link lengths set via the above mentioned methods. This is done in a loop for each link and, looking at the source, this comes down to essentially one line 代码:

l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;

l计算为link的源节点和目标节点之间的欧氏距离,所需的link距离distances[i]和link 的 strengths[i] 这条线决定了如何将两个节点拉到一起或将它们推开以接近通过 force.linkDistance() 设置的 link 距离。很容易看出,link 强度对合力有线性影响。然而,与 API 文档相反,它定义了强度的有效范围在 [0,1] 区间内,源代码没有对force.linkStrength().

设置的值

2。 Gravity. The second force to be calculated will take into account gravitational forces 在每个节点上。

3。 Charge. Lastly, the mutual forces of the nodes' charges 已计算。

因为所有计算出的力的影响都是叠加的,并且会累加到给定滴答的每个节点的最终移动中,很明显,link 长度只是整个节点的一部分计算。另外两种力量可能削弱甚至逆转其作用。

关于你的问题

Does that mean that if I was to set linkDistance to 150, the links with linkStrength(1.0) will be closer to 150 than the ones with linkStrength(.1)?

结果很大程度上取决于力布局参数的设置和节点的分布,仍然不能保证links的最终长度。