d3如何补间饼图的内半径 [英] d3 how to tween inner radius for pie chart

查看:74
本文介绍了d3如何补间饼图的内半径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将饼图动画化为甜甜圈图(或环形图). 这是我的代码:

I need to animate pie chart into a donut chart (or ring chart). Here is my code:

  var arc = d3.svg.arc().outerRadius(radius-margin).innerRadius(0)
  var arc2 = d3.svg.arc().outerRadius(radius-margin).innerRadius(60)

  var path = pie_chart.selectAll('path')
    .data(pie(data))
    .enter()
    .append('path')
    .attr('d', arc)
    .attr('fill', function(d, i) {
      return color_scale(d.data.device)
    })
    .transition().attr('d', arc2)

有时它可以工作,但有时却不行.我试图将过渡应用到弧,但无法正常工作.

Some times it's working but sometimes it is not. I have tried to apply transition to arc but not working.

 var arc2 = d3.svg.arc().outerRadius(radius-margin).innerRadius(0).transition().innerRadius(60)

推荐答案

我会编写自己的 arcTween 可以完全控制过渡的功能:

I would write my own arcTween function for this to take complete control of the transition:

function arcTween(d) {
  var i = d3.interpolateNumber(0, radius-70); //<-- radius of 0 to donut
  return function(t) {
    var r = i(t),
        arc = d3.svg.arc()
          .outerRadius(radius - 10)
          .innerRadius(r); //<-- create arc
    return arc(d); //<-- return arc path
  };
}


完整代码:


Full code:

<!DOCTYPE html>
<meta charset="utf-8">
<style>
  .arc text {
    font: 10px sans-serif;
    text-anchor: middle;
  }
  
  .arc path {
    stroke: #fff;
  }
</style>

<body>
  <script src="//d3js.org/d3.v3.min.js"></script>
  <script>
    var width = 500,
      height = 500,
      radius = Math.min(width, height) / 2;

    var color = d3.scale.category10();

    var arc = d3.svg.arc()
      .outerRadius(radius - 10)
      .innerRadius(0);

    var pie = d3.layout.pie()
      .sort(null)
      .value(function(d) {
        return d;
      });

    var svg = d3.select("body").append("svg")
      .attr("width", width)
      .attr("height", height)
      .append("g")
      .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

    var data = [10, 20, 30, 40];

    var g = svg.selectAll(".arc")
      .data(pie(data))
      .enter().append("g")
      .attr("class", "arc");

    g.append("path")
      .attr("d", arc)
      .style("fill", function(d, i) {
        return color(i);
      })
      .transition()
      .delay(100)
      .duration(5000)
      .attrTween("d", arcTween);
      
    function arcTween(d) {
      var i = d3.interpolateNumber(0, radius-70);
      return function(t) {
        var r = i(t),
            arc = d3.svg.arc()
              .outerRadius(radius - 10)
              .innerRadius(r);
        return arc(d);
      };
    }
      
  </script>
</body>

或者只是让某人头疼:

<!DOCTYPE html>
<meta charset="utf-8">
<style>
  .arc text {
    font: 10px sans-serif;
    text-anchor: middle;
  }
  
  .arc path {
    stroke: #fff;
  }
</style>

<body>
  <script src="//d3js.org/d3.v3.min.js"></script>
  <script>
    var width = 500,
      height = 500,
      radius = Math.min(width, height) / 2;

    var color = d3.scale.category10();

    var arc = d3.svg.arc()
      .outerRadius(radius - 10)
      .innerRadius(0);

    var pie = d3.layout.pie()
      .sort(null)
      .value(function(d) {
        return d;
      });

    var svg = d3.select("body").append("svg")
      .attr("width", width)
      .attr("height", height)
      .append("g")
      .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

    var data = [10, 20, 30, 40];

    var g = svg.selectAll(".arc")
      .data(pie(data))
      .enter().append("g")
      .attr("class", "arc");

    var arcs = g.append("path")
      .attr("d", arc)
      .style("fill", function(d, i) {
        return color(i);
      });
    
    (function repeat() {
      arcs.transition()
        .duration(500)
        .attrTween("d", arcTweenOut)
        .transition()
        .duration(500)
        .attrTween("d", arcTweenIn)
        .each('end', repeat)
    })();
    
    function arcTweenOut(d) {
      var i = d3.interpolateNumber(0, radius-70);
      return function(t) {
        var r = i(t),
            arc = d3.svg.arc()
              .outerRadius(radius - 10)
              .innerRadius(r);
        return arc(d);
      };
    }
    
    function arcTweenIn(d) {
      var i = d3.interpolateNumber(radius-70, 0);
      return function(t) {
        var r = i(t),
            arc = d3.svg.arc()
              .outerRadius(radius - 10)
              .innerRadius(r);
        return arc(d);
      };
    }
      
  </script>
</body>

这篇关于d3如何补间饼图的内半径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆