【问题标题】:Updating a Pie Chart in d3.js在 d3.js 中更新饼图
【发布时间】:2017-10-08 10:00:04
【问题描述】:

我在整个 StackOverflow 中搜索了许多更新饼图的示例,并查看了与更新 d3.js 中的饼图相关的 d3.js 块,但我似乎不能只使用 d3 进行简单的更新。 js 版本 4。我确定我错过了一些重要的东西,但我没有看到它。这个想法是单击“更新”按钮只会将数据更改为不同的集合,该集合仅由一个元素不同。我有一个 Fiddle (https://jsfiddle.net/qL9yy2b2/1/),它显示了我此时正在运行的代码(或不作为,视情况而定)。

对更新函数的初始调用会根据第一个数据集创建饼图,但由“更新”按钮启动的第二个调用什么也不做。我知道饼图生成器正在生成正确的对象(我检查了要检查的对象),但没有重绘路径。

以下是代码:

var pieGenerator = d3.pie()
  .value(function(d) {return d.quantity;})
  .sort(function(a, b) {
    return a.name.localeCompare(b.name);
  });

var fruits = [
  {name: 'Apples', quantity: 20},
  {name: 'Bananas', quantity: 40},
  {name: 'Cherries', quantity: 50},
  {name: 'Damsons', quantity: 10},
  {name: 'Elderberries', quantity: 30},
];
var fruits2 = [
  {name: 'Blueberries', quantity: 40},
  {name: 'Bananas', quantity: 40},
  {name: 'Cherries', quantity: 50},
  {name: 'Damsons', quantity: 10},
  {name: 'Elderberries', quantity: 30},
];

var arcGenerator = d3.arc()
  .innerRadius(75)
  .outerRadius(200)
  .padAngle(.02)
  .padRadius(100)
  .cornerRadius(4);

function doUpdate() {
  update(fruits2);
}

function update(myData) {

  var arcData = pieGenerator(myData);
  var colorDomain = myData.map(function(a) {return a.name;});
  var colorScale = d3.scaleOrdinal()
    .domain(colorDomain)
    .range(['#ff2800','#58595B','#006c93','#8D2048','#00746F'])

  // Create a path element and set its d attribute
  var u = d3.select('g')
    .selectAll('path')
    .data(arcData);

  u.enter()
    .append('path')
    .attr('d', arcGenerator)
    .each(function(d){
      d3.select(this)
        .style('fill',function(d) {
          return colorScale(d.data.name);
        })
    });

  u.exit().remove();

【问题讨论】:

    标签: javascript d3.js charts


    【解决方案1】:

    现在,您的更新函数中只有一个“进入”和一个“退出”选项。

    您必须创建一个“更新”选择,如下所示:

    var u = d3.select('g')
        .selectAll('path');
    
    u.data(arcData)
        .enter()
        .append('path')
        .merge(u)
        .attr('d', arcGenerator)
        .each(function(d) {
            d3.select(this)
                .style('fill', function(d) {
                    return colorScale(d.data.name);
                })
        });
    
    u.exit().remove();
    

    这是你更新的(不是双关语)小提琴:https://jsfiddle.net/qbjt80ts/

    和 Stack sn-p 中相同的代码:

    var pieGenerator = d3.pie()
      .value(function(d) {
        return d.quantity;
      })
      .sort(function(a, b) {
        return a.name.localeCompare(b.name);
      });
    
    var fruits = [{
      name: 'Apples',
      quantity: 20
    }, {
      name: 'Bananas',
      quantity: 40
    }, {
      name: 'Cherries',
      quantity: 50
    }, {
      name: 'Damsons',
      quantity: 10
    }, {
      name: 'Elderberries',
      quantity: 30
    }, ];
    var fruits2 = [{
      name: 'Blueberries',
      quantity: 40
    }, {
      name: 'Bananas',
      quantity: 40
    }, {
      name: 'Cherries',
      quantity: 50
    }, {
      name: 'Damsons',
      quantity: 10
    }, {
      name: 'Elderberries',
      quantity: 30
    }, ];
    
    function doUpdate() {
      update(fruits2);
    }
    
    // Create an arc generator with configuration
    var arcGenerator = d3.arc()
      .innerRadius(75)
      .outerRadius(200)
      .padAngle(.02)
      .padRadius(100)
      .cornerRadius(4);
    
    function update(myData) {
    
      var arcData = pieGenerator(myData);
      var colorDomain = myData.map(function(a) {
        return a.name;
      });
      var colorScale = d3.scaleOrdinal()
        .domain(colorDomain)
        .range(['#ff2800', '#58595B', '#006c93', '#8D2048', '#00746F'])
    
      // Create a path element and set its d attribute
      var u = d3.select('g')
        .selectAll('path');
    
      u.data(arcData)
        .enter()
        .append('path')
        .merge(u)
        .attr('d', arcGenerator)
        .each(function(d) {
          d3.select(this)
            .style('fill', function(d) {
              return colorScale(d.data.name);
            })
        });
    
      u.exit().remove();
    }
    update(fruits);
    path {
      fill: orange;
      stroke: white;
    }
    
    text {
      font-family: "Helvetica Neue", Helvetica, sans-serif;
      font-size: 12px;
      font-weight: bold;
      fill: white;
      text-anchor: middle;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.2/d3.min.js"></script>
    <div id="menu">
      <button onClick="doUpdate();">Update</button>
    </div>
    <svg width="700" height="500">
      <g transform="translate(300, 250)"></g>
    </svg>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 2013-03-28
      相关资源
      最近更新 更多