javascript - d3 在给定半径内为气泡图设置动画

标签 javascript d3.js

enter image description here

//气泡图基础。 http://jsfiddle.net/NYEaX/1450/

我正在尝试为气泡设置动画 - 通过改变它们的比例 - 如果可能的话,它们会淡入淡出。在某个阶段,我需要用某种重力将它们聚集在一起,以占据更多的包容圆周。

(function() {

    var diameter = 250;

    var svg = d3.select('#graph').append('svg')
      .attr('width', diameter)
      .attr('height', diameter);

    var bubble = d3.layout.pack()
      .size([diameter, diameter])
      .value(function(d) {
        return d.size;
      })
      .padding(3);

    var color = d3.scale.ordinal()
      .domain(["Lorem ipsum", "dolor sit", "amet", "consectetur", "adipisicing"])
      .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56"]);


  function randomData() {

      var data1 = {
        "children": [
                {
                  name: "AA",
                  className: "aa",
                  size: 170
                },
                {
                  name: "BB",
                  className: "bb",
                  size: 393
                },
                {
                  name: "CC",
                  className: "cc",
                  size: 293
                },
                {
                  name: "DD",
                  className: "dd",
                  size: 89
                }
              ]
      };

      var data2 = {
        "children": [
                {
                  name: "AA",
                  className: "aa",
                  size: 120
                },
                {
                  name: "BB",
                  className: "bb",
                  size: 123
                },
                {
                  name: "CC",
                  className: "cc",
                  size: 193
                },
                {
                  name: "DD",
                  className: "dd",
                  size: 289
                }
              ]
      };



          var j = Math.floor((Math.random() * 2) + 1);
          console.log("j", j);

          if (j == 1) {
            return data1;
          } else {
            return data2;
          }

        }

  change(randomData());

  d3.select(".randomize")
    .on("click", function() {
      change(randomData());
    });

  function change(data) {
    console.log("data", data);

    // generate data with calculated layout values
    var nodes = bubble.nodes(data)
      .filter(function(d) {
         return !d.children;
      }); // filter out the outer bubble


    var vis = svg.selectAll('circle')
      .data(nodes);

    vis.enter()
      .insert("circle")
      .attr('transform', function(d) {
        return 'translate(' + d.x + ',' + d.y + ')';
      })
      .attr('r', function(d) {
        return d.r;
      })
      .style("fill", function(d) {
        return color(d.name);
      })
      .attr('class', function(d) {
        return d.className;
      });

    vis
      .transition().duration(1000)

    vis.exit()
      .remove();

  };

  })();

最佳答案

这些动画气泡将成为整个图表的一部分 - 我需要相应的支持来微调动画弧线和气泡。所以饼图圆弧应该平滑过渡——气泡应该淡入/淡出/半径增大/半径减小

enter image description here

最新的 fiddle 。 http://jsfiddle.net/NYEaX/1505/

( http://jsfiddle.net/NYEaX/1506/ )- 重构

 1. -- how to animate the arcs
 2. -- how to animate the bubbles
 3. -- adding back the randomise button to test with 2 dummy data sets.

这是旧的馅饼动画,效果很好

                /* ------- ANIMATE PIE SLICES -------*/
                var slice = doughpie.select(".slices").selectAll("path.slice")
                  .data(pie(data), key);

                slice.enter()
                  .insert("path")
                  .style("fill", function(d) {
                    return color(d.data.label);
                  })
                  .style("transform", function(d, i){
                    //return "translate(0, 0)";
                  })
                  .attr("class", "slice");

                slice
                  .transition().duration(1000)
                  .attrTween("d", function(d) {
                    this._current = this._current || d;
                    var interpolate = d3.interpolate(this._current, d);
                    this._current = interpolate(0);
                    return function(t) {
                      return arc(interpolate(t));
                    };
                  })

                slice.exit()
                  .remove();
                /* ------- ANIMATE PIE SLICES -------*/

//这是当前饼图弧线 - 但当我尝试以相同方式为饼图设置动画时 - 它失败了。

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

g.append("path")
  .attr("d", arc)
  .style("fill", function(d) {
    return color(d.data.label);
  });

arc
  .outerRadius(radius - 10)
  .innerRadius(0);

关于javascript - d3 在给定半径内为气泡图设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39156400/

相关文章:

javascript - 使用数据集中的 d3.js 在 svg 的 g 元素中添加两个不同的 svg 元素

javascript - n.call 不是转换时的函数问题

javascript - 无法在React中使用d3.js绘制条形图

javascript - Typescript 接口(interface)中的日期在检查时实际上是字符串

javascript - jquery 在行中查找按钮并更改其类

javascript - 是否可以使用爆米花 JS 导出带有视频叠加评论的视频?

javascript - Rails 4 : "//= require_tree ." in application. js 不包含我的 js 文件在/app/assets/javascripts

javascript - 为什么 "1 << 32"在 Javascript 中等于 1

javascript - 负面展望中的字符串被部分捕获

javascript - 具有动态轴缩放的固定中心