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

时间:2015-12-18 11:54:31

标签: javascript d3.js force-layout

我正在使用图表来显示不同节点之间的关系。与节点关系越密切(根据业务逻辑),节点应该越靠近在一起。

我注意到linkStrength .1的某些链接更短(这就是我想要达到的目标)而其他一些具有相同强度的链接比<{1}} linkStength更长。从关于力布局参数的文档中,我现在找到了这个引用:

  

默认的linkStrength值为1.0,它保持了linkDistance的完整效果。但是,通过将linkStrength的值设置为小于1,可以放宽距离约束。

这是否意味着如果我要将1设置为linkDistance,那么150的链接将比linkStrength(1.0)的链接更接近150?如果是的话,它们是否需要更短,更长或根本不重要?因为我对布局感到有些惊讶。

2 个答案:

答案 0 :(得分:8)

简而言之:当使用D3的力布局时,没有内置的方法来强制执行固定长度的链接。力布局本质上是动态的,force.linkDistance()force.linkStrength()的设定值仅对每次迭代执行的计算集引入另一种力,即每个 tick ,而力布局正在运行。

每个tick计算出三种力:

<强> 1。 Link length。要计算的第一个力是通过上述方法设置的链接长度的调整。这是在每个链接的循环中完成的,查看源代码,这基本上归结为one line代码:

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

l计算为链接的源节点和目标节点之间的欧几里德距离,所需的链接距离distances[i]和链接strengths[i]这个line确定如何将两个节点拉到一起或将它们分开以近似通过force.linkDistance()设置的链接距离。很容易看出,链接强度对产生的力具有线性影响。但是,与API文档相反,它定义了强度在 [0,1] 区间内的有效范围,源代码不会对{{1}设置的值施加任何限制。 }}

<强> 2。 Gravity。要计算的第二个力量将考虑每个节点上的gravitational forces

第3。 Charge最后,节点的相互作用力&#39}。计算charges

因为所有计算出的力的影响都是叠加的,并且会累加到给定刻度的每个节点的最终运动,所以很明显,链接长度只是整个计算的一部分。另外两种力量可能削弱甚至扭转其影响。

关于你的问题

  

这是否意味着如果我将linkDistance设置为150,那么linkStrength(1.0)的链接将比具有linkStrength(.1)的链接更接近150?

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

答案 1 :(得分:2)

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

var check = "A23"

var phoneNumber: Int?

if let number = Int.init(check) {
    phoneNumber = number
    print("Success")
}

print(phoneNumber)

// nil

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