【问题标题】:D3: How to create slow transition of circle radii for nodes in force directed graphs?D3:如何为力有向图中的节点创建圆半径的缓慢过渡?
【发布时间】:2013-07-10 07:26:47
【问题描述】:

我正在使用 D3 生成的单选按钮将 FDG 布局中的节点大小(通过鼠标单击)从默认大小切换到缩放幅度。您可以在Node Cluster Diagram (http://nounz.if4it.com/Nouns/Applications/A__Application_1.NodeCluster.html) 的左上角找到单选按钮

在默认数字和缩放幅度之间切换节点圆的代码如下所示...

    var densityControlClick = function() {

      var thisObject = d3.select(this);
      var typeValue = thisObject.attr("density_type");
      var oppositeTypeValue = (function() {
        if(typeValue=="On") {
          return "Off";
        } else {
          return "On";
        }
      })();

      var densityBulletSelector = "." + "densityControlBullet-" + typeValue;
      var selectedBullet = d3.selectAll(densityBulletSelector);
      selectedBullet.style("fill", "Black") 

      var oppositeDensityBulletSelector = "." + "densityControlBullet-" + oppositeTypeValue;
      var selectedOppositeBullet = d3.selectAll(oppositeDensityBulletSelector);
      selectedOppositeBullet.style("fill", "White") 

      if(typeValue=="On") {
        var selectedNodeCircles = d3.selectAll("#NODE");
        selectedNodeCircles.attr("r", function(d){ return rRange(d.rSize); });
      }
      else {
        var selectedNodeCircles = d3.selectAll("#NODE");
        selectedNodeCircles.attr("r", function(d) { if (d.id==focalNodeID) { return centerNodeSize; } else { return defaultNodeSize; } } );
      }

    }

一切正常,但圆半径的过渡是瞬时的。我希望过渡慢一点,以展示 D3 的动态特性。

无论如何我知道如何更改上述代码以减慢圆的大小/半径过渡吗?而且,您能否用英语解释发生了什么,以便我理解代码背后的理论? (注意:我尝试阅读 API,但发现应用转换并不简单。)

感谢您的帮助。我很感激。

【问题讨论】:

    标签: d3.js transition force-layout


    【解决方案1】:

    在最简单的版本中,将转场视为选择的装饰。要更新你的代码,你需要做的就是去你拥有的地方:

    selectedNodeCircles.attr(...);
    

    并插入一个过渡:

    selectedNodeCircles.transition().duration(1000).attr(...)
    

    因为您只是将“r”属性从一个数值更改为另一个 D3 将负责为两者之间的过渡设置动画。可以看一个非常简化的例子here

    您的代码中发生的情况是选择中的每个元素都为 r 获取了一个新值。设置好属性,重新渲染 svg 就完成了。

    当您添加过渡时,不是直接设置属性,而是设置为选择的每个元素创建的过渡的结束值。事实上,如果您在过渡期间进行调试,您应该能够在所有圆圈上看到 __transition 对象。

    此转换对象将读取属性的初始值并获取最终值,然后根据随时间从 0 变为 1 的参数计算中间值。该参数从 0 到 1 所需的时间取决于转换的持续时间的值(它如何从 0 到 1 取决于它的“缓动”功能)。

    更多详情请查看this tutorial

    【讨论】:

    • 这是一个很好的答案。谢谢你。它工作得很干净,你的描述很有意义。您可能想寻找我的下一个问题,它将这个问题提升到一个新的水平(一起转换多个事物)。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-07-22
    • 2013-12-21
    • 2013-11-22
    • 2014-01-21
    • 2019-04-23
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多