如何将多事物折线图转换为新数据集

时间:2013-05-25 02:04:05

标签: d3.js

我真的可以使用一些指导设置我的多重系列折线图上的过渡。作为我需要的一个例子,我已经开始使用这个伟大的多重系列折线图:http://bl.ocks.org/mbostock/3884955。对于该代码,我添加了一个使用setInterval()调用一次的update()函数。我还创建了一个名为data2.csv的新数据集,它类似于data.tsv但具有不同的值。

更新功能应更改折线图显示的数据。忘了做一个漂亮的平滑过渡,我甚至无法在图表视图中获取数据。当我尝试使用更新功能时,看起来新数据被正确加载到javascript变量中,但图表上的线条根本不会改变。

我已经看过这个问题的变化问了几次,但还没有找到答案。任何人都可以帮我弄清楚如何将这个多系列折线图转换为新的数据集(也是多个数据集)?

function update() {

    d3.csv("data2.csv", function(error, data) {

    color.domain(d3.keys(data[0]).filter(function(key) { return key !== "date"; }));

        // format the date
   data.forEach(function(d) {
        d.date = parseDate(d.date);
  });

    // rearrange the data, same as in the original example code
var cities2 = color.domain().map(function(name) {
        return {
          name: name,
          values: data.map(function(d) {
            return {date: d.date, temperature: +d[name]};
          })
        };
      });

    // update the .city g's to the new dataset
 var city2 = svg.selectAll(".city")
      .data(cities2);

    // redraw the lines with the new data??? 
  city2.selectAll("path")
      .attr("d", function(d) { return line(d.values); });

 clearInterval(transitionInterval);
});
}

更新:NikhilS的回答包含评论跟踪中解决方案的关键。

2 个答案:

答案 0 :(得分:2)

你应确保遵循Mike Bostock在General Update Pattern上的内容中所述的回车+更新流程。看起来您没有调用任何类型的d3 transition。您还没有为更新功能指定输入或退出,如果您有新数据和/或旧数据输出,这将导致问题。尝试更改此内容:

 var city2 = svg.selectAll(".city")
  .data(cities2);

 city2.selectAll("path")
  .attr("d", function(d) { return line(d.values); });

以下内容:

 var city2 = svg.selectAll('.city')
   .data(cities2);

 var cityGroups = city2.enter().append('g')
   .attr('class', 'city');

 cityGroups.append('path')
  .attr('class', 'line');

 d3.transition().selectAll('.line')
  .attr('d', function(d) { return line(d.values); });

 city2.exit().remove();

我在一段时间后重新加入并更新了基本数据,您可以view here

答案 1 :(得分:1)

使用d3 Transition,你可以制作某种动画。

如果要选择数据的子间隔来绘制图形,不需要对数据进行操作,只需使用d3画笔并剪切图形

对于包含大多数折线图元素的多系列折线图,您可以参考此示例:http://mpf.vis.ywng.cloudbees.net/