如何在d3强制布局中依赖重力数据

时间:2013-05-25 10:15:09

标签: d3.js gravity force-layout

我想用两种类型的节点进行力布局:类型1停留在中心,类型2移动到外围。类型1和类型2之间存在链接,因此图形应该保持在一起。

我想我可以通过固定类型1节点的重力为正,对类型2固定负值来实现这一点:

  force.gravity(function(d){return (d.type=='pers')?10:-15})

但重力似乎是所有参数的一个。还有其他方法或者我可以更改它以使重力参数节点依赖吗?或者以完全不同的方式实现这一目标?

2 个答案:

答案 0 :(得分:3)

我曾经尝试了一段时间,结果却没有任何效果。如果你看一下代码,看起来引力不能起作用:

比较.charge()和linkStrength():

force.linkStrength = function(x) {
  if (!arguments.length) return linkStrength;
  linkStrength = typeof x === "function" ? x : +x;
  return force;
};
force.charge = function(x) {
  if (!arguments.length) return charge;
  charge = typeof x === "function" ? x : +x;
  return force;
};

到.gravity():

force.gravity = function(x) {
  if (!arguments.length) return gravity;
  gravity = +x;
  return force;
};

我不确定其他地方是否存在进一步的限制,但如果你将重力传递给一个函数,它将不知道如何处理它。

答案 1 :(得分:2)

电荷是力的属性,而不是节点的属性。您可以为每个节点收取不同的费用。节点具有负电荷,因此它们被“重力”力吸引并被其他节点排斥。如果为类型1的节点设置更大(大小)的电荷,为类型2的节点设置更少的电荷,则可以达到预期的效果。

Mike Bostock的演讲解释并演示了不同的力量配置: