我正在使用图表来显示不同节点之间的关系。与节点关系越密切(根据业务逻辑),节点应该越靠近在一起。
我注意到linkStrength
.1
的某些链接更短(这就是我想要达到的目标)而其他一些具有相同强度的链接比<{1}} linkStength
的更长。从关于力布局参数的文档中,我现在找到了这个引用:
默认的linkStrength值为1.0,它保持了linkDistance的完整效果。但是,通过将linkStrength的值设置为小于1,可以放宽距离约束。
这是否意味着如果我要将1
设置为linkDistance
,那么150
的链接将比linkStrength(1.0)
的链接更接近150?如果是的话,它们是否需要更短,更长或根本不重要?因为我对布局感到有些惊讶。
答案 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