D3饼图更新后未计算新路径值

时间:2015-09-03 22:44:27

标签: javascript d3.js

我有一个非常简单的数据结构,我希望在同一个对象中根据不同的键/值对更新D3 Donut Chart。这是数据:

var data = [
    {
        id: 1,
        name: 'Bernie Sanders',
        name2: 'Jesus Christ',
        color: '#0362ad',
        state: 3.55,
        national: 4.88
    },
    {
        id: 2,
        name: 'Donald Trump',
        name2: 'Miley Cyrus',
        color: '#f0a611',
        state: 1.36,
        national: 2.65
    }
]

我按照以下方式设置饼图:

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

var arc = d3.svg.arc()
    .outerRadius(radius - 30)
    .innerRadius(radius - 80);

var paths = chart.selectAll('g')
    .data(pie(data), function(d) { return d.data.id })
    .enter()
    .append('g')
    .attr('class', 'arc')
    .attr('transform', 'translate(' + (radius - margin.left) + ',' + (radius - margin.top) + ')');

var arcs = paths.append('path')
    .attr('d', arc)
    .style('fill', function(d) { return d.data.color; });

我有一个update()功能,我尝试更改圆环图值以显示national值,而不是state值。

// "which" is equal to 'state' or 'national'
function update(which) {

    // change location of values
    pie.value( function(d) { return d[which] );

    // compute new angles
    paths.data(pie(data));

    // update arcs
    arcs.attr('d', arc);
};

我的弧未正确更新,当我将它们记录到控制台时,__data__属性仍显示初始化属性(d.state)的值和角度。

如何正确计算每个弧的新路径?

1 个答案:

答案 0 :(得分:1)

您需要处理路径的转换方案,如下所示:



(function() {

  var data = [{
    id: 1,
    name: 'Bernie Sanders',
    name2: 'Jesus Christ',
    color: '#0362ad',
    state: 3.55,
    national: 4.88
  }, {
    id: 2,
    name: 'Donald Trump',
    name2: 'Miley Cyrus',
    color: '#f0a611',
    state: 1.36,
    national: 2.65
  }]

  var svgElement = $("#piechart");
  var width = svgElement.width();
  var height = svgElement.height();
  var radius = Math.min(width, height) / 2;

  var chart = d3.select("#piechart");

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

  var arc = d3.svg.arc()
    .outerRadius(radius - 30)
    .innerRadius(radius - 80);

  chart.append('g')
    .attr('class', 'arc')
    .attr('transform', 'translate(' + (radius) + ',' + (radius) + ')');

  var paths = chart.select('g').selectAll('path')
    .data(pie(data), function(d) {
      return d.data.id
    });

  paths.enter()
    .append('path')
    .attr('d', arc)
    .style('fill', function(d) {
      return d.data.color;
    })

  // which is equal to 'state' or 'national'
  function update(which) {

    pie.value(function(d) {
        return d[which]
      });

    paths.data(pie(data), function(d) {
        return d.data.id
      });

    paths.transition()      
      .duration(1000)
      .attr('d', arc)
      .style('fill', function(d) {
        return d.data.color;
      });

  };

  $("#stateButton").click(function() {
    update("state");
  });
  $("#nationalButton").click(function() {
    update("national");
  });

})()

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<button id="stateButton">State</button>
<button id="nationalButton">National</button>
<svg id="piechart"></svg>
&#13;
&#13;
&#13;