d3如何调整饼图的内半径

OMG*_*POP 3 svg d3.js

我需要将饼图动画制作成圆环图(或环形图)。这是我的代码:

  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)
Run Code Online (Sandbox Code Playgroud)

有时它有效,但有时却无效。我尝试将过渡应用于圆弧但不起作用。

 var arc2 = d3.svg.arc().outerRadius(radius-margin).innerRadius(0).transition().innerRadius(60)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ark 5

我将编写自己的arcTween函数,以完全控制过渡:

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
  };
}
Run Code Online (Sandbox Code Playgroud)

完整代码:

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
  };
}
Run Code Online (Sandbox Code Playgroud)


或者只是让某人头疼:

<!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>
Run Code Online (Sandbox Code Playgroud)