D3.js:在另一个甜甜圈内随机动画甜甜圈

时间:2017-06-04 17:01:54

标签: d3.js

我找到了这段代码:

http://digodat.com/ba_test.html

在甜甜圈图表中随机改变比例。

我找到了其他代码:

http://digodat.com/ba_test_4.html

这让我在甜甜圈里面制作一个甜甜圈。

现在,我想要一个按钮,可以随机创建我在第一个文件中的相同效果,但应用于我的第二个文件的两个甜甜圈,所以当我点击按钮时,每个切片都会发生变化。

我已经尝试过复制和测试代码的特定部分,但我无法让它工作

1 个答案:

答案 0 :(得分:1)

有很多方法可以做你想要的。这是你的第二个例子的快速重构:

<html>

<head>
  <script type="text/javascript" src="https://d3js.org/d3.v3.min.js"></script>
  <title></title>

  <body>
    <div id="duration">
      <svg style="height:300px;width:100%"></svg>
      <button class="random">Random Inner</button>
      <button class="random">Random Outer</button>
    </div>

    <script type="text/javascript">
    
      var dataset = {
        apples: [13245, 28479, 11111, 11000, 3876],
        oranges: [53245, 28479, 19697, 24037, 19654],
      };

      var width = d3.select('#duration').node().offsetWidth,
        height = 300,
        cwidth = 33;

      var color = [
        ['#1352A4', '#2478E5', '#5D9CEC', '#A4C7F4', '#DBE8FB'],
        ['#58A53B', '#83C969', '#A8D996', '#CDE9C3', '#E6F4E1']
      ];

      var pie = d3.layout.pie()
        .sort(null);

      var arcs = [d3.svg.arc()
        .innerRadius(95)
        .outerRadius(cwidth * 2.5),
        d3.svg.arc()
        .innerRadius(70 + cwidth)
        .outerRadius(cwidth * 3.5)
      ];

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

      var gs = svg.selectAll("g")
        .data(d3.values(dataset))
        .enter()
        .append("g")
        .attr("class", function(d, i) {
          return i === 0 ? "inner" : "outer";
        });

      var path = gs.selectAll("path")
        .data(function(d, i) {
          return pie(d);
        })
        .enter().append("path")
        .attr("fill", function(d, i, j) {
          return color[j][i];
        })
        .attr("d", function(d, i, j) {
          return arcs[j](d);
        });

      d3.selectAll(".random").on("click", function(d, i) {
        
        var slices = i === 0 ? d3.selectAll(".inner>path") : d3.selectAll(".outer>path");

        var randData = pie(d3.range(5).map(function() {
          return Math.random() * 1000;
        }));

        randData.forEach(function(d, i) {
          d._current = slices.data()[i];
        })

        slices
          .data(randData)
          .transition().duration(1000)
          .attrTween("d", function(d) {
            var interpolate = d3.interpolate(d._current, d);
            return function(t) {
              return arcs[i](interpolate(t));
            };
          })

      })
    </script>
  </body>

</html>