D3.js:如何绘制简单且可更新的折线图?

8
我正在尝试在D3中绘制一个简单的折线图,但遇到了一些问题。
我希望图表是动态的-因此当数据更新时,我希望图表过渡到新的值。因此,在我的代码中需要使用D3转换,并且我找不到使用折线图进行转换的好例子。
以下是我代码的相关部分。目前,这根本没有画任何东西。
var data = [
 {
  "air_produced": 0.660985, 
  "air_used": 0.342706, 
  "datestr": "2012-12-01 00:00:00", 
  "energy_used": 0.106402
 } ... ];
var parseDate = d3.time.format("%Y-%m-%d %H:%M:%S");
data.forEach(function(d) {
  d.date = parseDate.parse(d.datestr);
});

var x = d3.time.scale().range([0, width]);
var y = d3.scale.linear().range([height, 0]);

var line = d3.svg.line()
  .x(function(d) { return x(d.date); })
  .y(function(d) { return y(d.energy_used); });

// How to draw the line?
var linegraph = d3.select("path.line").datum(data);
line.transition().duration(1000).attr("d", line);
linegraph.enter().append("path")
    .attr("class", "line")
    .attr("d", line);

这里是完整图表的JSFiddle链接:http://jsfiddle.net/zNX8p/


这似乎有一个可行的例子:http://bl.ocks.org/benjchristensen/2579599 - jeffery_the_wind
这并没有展示如何在有新数据时更新该行。 - Richard
2个回答

2
今日免费次数已满, 请开通会员/明日再来
var linegraph = svg.selectAll("path.line").data([data], function(d) { return d.date; });

linegraph.transition().duration(1000).attr('d', line);

linegraph.enter().append("path")
    .attr("class", "line")
    .attr("d", line);

datum 不会返回一个 enter 选择集,因此你需要通过 data 将数据传递进去。


这个最终可行了吗?我卡在同一个步骤了。 - Union find

1

d3有一个通用的更新模式,您应该在此情况下使用。

惯例是有两个函数,一个用于设置可视化,另一个用于获取数据并更新可视化。

更新函数接收新数据,绑定它,更新图形,然后根据需要添加或删除对象。

Mike Bostock 编写了一系列很棒的文章来解释这个模式, 您可以在这里找到https://twitter.com/mbostock/status/252496768267333632


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接