【问题标题】:D3 Force Layout Variable Repulsive FocesD3 力布局可变排斥力
【发布时间】:2014-07-27 21:13:10
【问题描述】:

我正在研究具有可变大小节点的图表:http://gordonsmith.github.io/Visualization/ (按 F2 开始强制布局)

是否可以在运行时根据节点大小改变排斥力?基本上我想“鼓励”布局不要有重叠的节点......

【问题讨论】:

  • 看起来力布局不适合你想要做的事情,但this example for collision detection 应该会有所帮助。不过,您将不得不调整代码以获得正确的元素尺寸。

标签: d3.js force-layout


【解决方案1】:

力布局允许您将一个函数传递给force.charge(),它可以让您指定每个节点的电荷强度,并将节点及其索引作为参数传递。

如果您要以这样一种方式创建 nodes 数据,即每个元素都有一个可访问的属性来表示其大小(例如边界圆的半径),那么您可以使用此数据来设置相对电荷值.

例如,如果数据中的每个元素都有一个属性 r 表示其半径,则可以执行以下操作:

var force = d3.layout.force()
  .nodes(nodes)
  .size([width,height])
  .charge(function(d) {
    return -5 * d.r;
  })
  .on('tick', tick)
  .start();

-5 因子的选择完全是任意的,您必须选择一个适合您的数据的值。正值表示吸引,负值表示排斥。

HERE 是一个使用圆圈的简单演示。

【讨论】:

  • 完美 - 正是我所期望的! (上面的演示随变化而更新)
  • 谢谢它真的有帮助,我注意到的一件事是当有链接时节点相互折叠并到中心,即 force.link(json.links),但是当我删除这条线时,节点根据需要完美击退。我在节点正确放置在 tick() 函数上之后引入了链接。