修改d3's力布局”;退火”;日程

modifying d3's force layout "annealling" schedule

本文关键字:布局 退火 日程 d3 修改      更新时间:2023-09-26

我有一个d3力布局图viz工作得很好,但它经常过早地被"卡住"。例如,节点正朝着一个好的位置抖动,如果"碰撞"它们(再次为它们的位置和start()注入一点随机性),它们最终会到达那里。如果我减少friction,问题也会变得更糟,因为用户认为它太疯狂了。

我在force.js源代码中提到了"annealing"(模拟退火),而暴露的alpha参数是一个关键因素。我想知道是否有人已经知道如何直接管理通用的退火时间表(而不必修补force.js!)?

答案的核心是@meetamit的评论(加速alpha的衰变)。当布局低于阈值时,您也可以停止调用布局,还可以通过在节点/链接移动中添加过渡来处理"抖动"。

animationStep = 200;
force.on('tick', function() {
    node.transition().ease('linear').duration(animationStep)
        .attr('transform', function(d) { 
             //your node transitions here 
        });
    var alpha = force.alpha();
    force.stop();
    setTimeout(function() {
      if (!alpha > 0.001) {
        force.alpha(alpha * 0.9);
      }
    }, animationStep);
  };
  force.on('tick', tick);