如何在d3中绘制具有复杂数据结构的折线图

时间:2013-07-24 08:39:39

标签: d3.js

我有以下复杂的数据结构:

[
Object {id: 15, targets: Array[2]},
Object {id: 26, targets: Array[2]},
Object {id: 39, targets: Array[2]}
]

'targets'是一个对象数组。他们每个人都有这样的形状:

Object {idTarget: "target1", events: Array[315]}
Object {idTarget: "target2", events: Array[310]}

'events'是一个包含要绘制的实际值的数组。 因此,每个元素都有这种形状:

Object {timestamp: 1373241642, value: 1801.335}

现在,有了这个结构化数据集,我想为每个外部对象创建一个svg组'g'(我指的是15,26和39),并且在每个组内部我要创建两行,一个对于每个目标,使用'events'中的值。

拥有一个平面数据集,可以很容易地按照模式继续绘制:select + data + enter + append,但是我遇到了这个复杂数据集的问题。

例如,我甚至不知道如何指定一个关键功能来启动。

svg.selectAll('.element')
.data(data, function(d){ return d.id + ?})

我想要这种键'15target1', '15target2', '26target1', '26target2'等等。

你是否建议简化数据集,放弃整齐组的可能性,或者这里有一个解决方法让我轻松画出我想要的东西?

感谢。

1 个答案:

答案 0 :(得分:5)

您需要nested selections。你的代码看起来像这样。

var gs = d3.selectAll("g").data(data, function(d) { return d.id; });
gs.enter().append("g");

var line = d3.svg.line().x(function(d) { return xscale(d.timestamp); })
                        .y(function(d) { return yscale(d.value); });
gs.selectAll("path")
  .data(function(d) { return d.targets; }, function(d) { return d.idTarget; })
  .enter().append("path")
  .attr("d", function(d) { return line(d.events); });