在d3中更新多系列区域图

时间:2014-07-15 23:54:43

标签: javascript d3.js data-visualization

我正在使用d3创建区域图。

此代码有效,但我对更新方法(切换)中的数据结构不满意,实际上我并不了解我做错了什么。

创建图表时,我通过以下方式传递数据:

data([nsw,qld])
// then draw the chart

当我更新图表时,我通过以下方式传递数据:

chart.data([nsw]);
// draw the nsw series in the chart
chart.data([qld]);
// draw the qld series in the chart

当然,我可以通过以[nsw,qld]

的正确格式传入数据来更新数据
  <script type="text/javascript" src="lib/d3.min.js" charset="utf-8"></script>
  <svg id="chart"></svg>

  <script>

  var NSW = "NSW";
  var QLD = "QLD";

  var width = 400;
  var height = 400;

  var years = [1,2,3,4,5];

  var data = years.map(function(){ return [Math.random(),Math.random()]; });   // generate bogus data
  var nsw = data.map(function(d) { return d[0];}); // extract new south wales data
  var qld = data.map(function(d) { return d[1];}); // extract queensland data

  var chart = d3.select("#chart").attr("width", width).attr("height", height).append("g");
  var x = d3.scale.linear().domain([0, years.length]).range([0, width]);
  var y = d3.scale.linear().domain([0, d3.max(data, function(d){ return Math.max(d[0], d[1]); })]).range([height,0]);
  var area = d3.svg.area().x(function(d,i) { return x(i); }).y0(height).y1(function(d, i) { return y(d); });

  console.log([nsw,qld])

  chart
  .selectAll("path.area")
  .data([nsw,qld])          // !!! here i can pass both arrays in.
  .enter()
  .append("path")
  .attr("fill", "rgba(0,0,0,0.5)")
  .attr("class", function(d,i) { return [NSW,QLD][i]; })
  .attr("d", area);

  chart.on("click", function() {

    data = years.map(function(){return [ Math.random(),Math.random()];}); // switch in some new random data

    var nsw = data.map(function(d) { return d[0];})
    var qld = data.map(function(d) { return d[1];})

    y.domain([0, d3.max(data, function(d){ return Math.max(d[0], d[1]); })]).range([height, 0]);

    var svg = chart.transition();

    /*
    svg
    .selectAll("path")
    .data([nsw,qld])        // !!! this doesn't work.
    .duration(750)
    .attr("d", function(d) { return area(d); });
    */

    chart.data([nsw]);      // !!! here i'm only passing in one!

    svg.select("path.NSW")
    .duration(750)
    .attr("d", function(d) {return area(d); });

    chart.data([qld]);      // !!! ...and then another

    svg.select("path.QLD")
    .duration(750)
    .attr("d", function(d) { return area(d); });
  });

  </script>

链接到小提琴: http://jsfiddle.net/MLA3x/

1 个答案:

答案 0 :(得分:2)

问题是您在更新部分中使用转换而不是选择。也就是说,您在过渡时调用.data(),这是您无法做到的。如果在更新数据后添加转换,它可以正常工作:

chart
 .selectAll("path")
 .data([nsw,qld])
 .transition()
 .duration(750)
 .attr("d", function(d) { return area(d); });

完整演示here