【问题标题】:Animating data motion between nodes in d3在 d3 中的节点之间动画数据运动
【发布时间】:2018-11-27 18:48:30
【问题描述】:

我有一个 d3v4 力导向图。为简单起见,我们假设它类似于this

图表显示流(如电网)。我希望能够为每个链接设置动画,以显示从目标到源的流程(带有移动的虚线、气泡等)。

有人知道怎么做吗?

【问题讨论】:

    标签: html css animation d3.js force-layout


    【解决方案1】:

    这是 Mike 的“悲惨世界”力有向图的略微修改版本,其中线由偏移量周期性递增的虚线组成(灵感来自 this post):

    var svg = d3.select("svg"),
        width = +svg.attr("width"),
        height = +svg.attr("height");
    
    var color = d3.scaleOrdinal(d3.schemeCategory20);
    
    var simulation = d3.forceSimulation()
        .force("link", d3.forceLink().id(function(d) { return d.id; }))
        .force("charge", d3.forceManyBody())
        .force("center", d3.forceCenter(width / 2, height / 2));
    
    d3.json("https://gist.githubusercontent.com/mbostock/4062045/raw/5916d145c8c048a6e3086915a6be464467391c62/miserables.json", function(error, graph) {
      if (error) throw error;
    
      var link = svg.append("g")
          .attr("class", "links")
        .selectAll("line")
        .data(graph.links)
        .enter().append("line")
          .attr("stroke-width", function(d) { return Math.sqrt(d.value); });
    
      var node = svg.append("g")
          .attr("class", "nodes")
        .selectAll("circle")
        .data(graph.nodes)
        .enter().append("circle")
          .attr("r", 5)
          .attr("fill", function(d) { return color(d.group); })
          .call(d3.drag()
              .on("start", dragstarted)
              .on("drag", dragged)
              .on("end", dragended));
    
      node.append("title")
          .text(function(d) { return d.id; });
    
      simulation
          .nodes(graph.nodes)
          .on("tick", ticked);
    
      simulation.force("link")
          .links(graph.links);
    
      var lines = d3.selectAll('line');
    
      var offset = 1; 
      setInterval(function() {
        lines.style('stroke-dashoffset', offset);
        offset += 1; 
      }, 50);
    
      function ticked() {
        link
            .attr("x1", function(d) { return d.source.x; })
            .attr("y1", function(d) { return d.source.y; })
            .attr("x2", function(d) { return d.target.x; })
            .attr("y2", function(d) { return d.target.y; });
    
        node
            .attr("cx", function(d) { return d.x; })
            .attr("cy", function(d) { return d.y; });
      }
    });
    
    function dragstarted(d) {
      if (!d3.event.active) simulation.alphaTarget(0.3).restart();
      d.fx = d.x;
      d.fy = d.y;
    }
    
    function dragged(d) {
      d.fx = d3.event.x;
      d.fy = d3.event.y;
    }
    
    function dragended(d) {
      if (!d3.event.active) simulation.alphaTarget(0);
      d.fx = null;
      d.fy = null;
    }
    .links line {
      stroke: #999;
      stroke-opacity: 0.6;
    }
    
    .nodes circle {
      stroke: #fff;
      stroke-width: 1.5px;
    }
    
    line {
      opacity: 0.5;
      stroke-dasharray: 10, 4;
    }
    <svg width="960" height="600"></svg>
    <script src="https://d3js.org/d3.v4.min.js"></script>

    创建图表后,我们可以开始定期更新虚线偏移量:

    var lines = d3.selectAll('line');
    
    // Updates the offset of dashes every 50ms:
    var offset = 1;
    setInterval( function() {
      lines.style('stroke-dashoffset', offset);
      offset += 1; 
    }, 50);
    

    这是与虚线关联的 css:

    line {
      opacity: 0.5;
      stroke-dasharray: 10, 4;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-16
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多