D3.js中的堆积区域

时间:2012-06-28 14:22:07

标签: javascript object d3.js charts

我正在使用D3.js而我在为多个系列的区域图表设置堆叠布局时遇到了问题。我有两种可能的数据结构(如果有帮助的话)。一个是提供给脚本的原始数据,在这个结构中:

var data = [{key: 'Group1', value: 37, date: '04/23/12'},
           {key: 'Group2', value: 12, date: '04/23/12'},
           {key: 'Group3', value: 46, date: '04/23/12'},
           {key: 'Group1', value: 32, date: '04/24/12'},
           {key: 'Group2', value: 19, date: '04/24/12'},
           {key: 'Group3', value: 42, date: '04/24/12'},
           {key: 'Group1', value: 45, date: '04/25/12'},
           {key: 'Group2', value: 16, date: '04/25/12'},
           {key: 'Group3', value: 44, date: '04/25/12'},
           {key: 'Group1', value: 24, date: '04/26/12'},
           {key: 'Group2', value: 52, date: '04/26/12'},
           {key: 'Group3', value: 64, date: '04/26/12'}]

第二个是使用此代码创建的嵌套结构:

 pData = d3.nest()
            .key(function(d) { return d.key; })
            .map(data);

导致这种结构:

pData = {Group1: [{date: 04/23/12, key: "Group1", value: 37}, 
                  {date: 04/24/12, key: "Group1", value: 32}, 
                  {date: 04/25/12, key: "Group1", value: 45},
                  ...],
         Group2: [{date: 04/23/12, key: "Group2", value: 12},
                  {etc, etc, etc}],
         GroupX: [...] }

我的问题:如何使用上述数据结构之一(或某些变体)设置d3.layout.stack()生成器,为我的数据创建堆叠结构,以便我可以将它传递给类似于此的区域生成器:

var areaGenerator = d3.svg.area()
    .interpolate('monotone')
    .x(function(d) { return x(d.date); })
    .y0(h)
    .y1(function(d) { return y(d.value); });

1 个答案:

答案 0 :(得分:12)

您必须将图层数组提供给堆栈布局,因此要更改的第一件事是使用nest.entries而不是nest.map。这将返回一个对象数组,其中包含key字段(例如“Group1”)和包含相关记录的values数组。然后,您将指定stack.values访问器,以便堆栈布局可以访问每个层的values数组。

您还需要为堆栈布局定义合适的 x y 访问器,以便它可以理解您的输入数据: x -accessor应返回d.date y -accessor应返回d.value。您还需要将日期字符串转换为日期;您可以使用d3.time.format来帮助解决此问题。例如:

var format = d3.time.format("%m/%d/%y");
data.forEach(function(d) { d.date = format.parse(d.date); });

最后,更改您的区域定义,以便将基线y0定义为y(d.y0),并将顶线y1定义为y(d.y0 + d.y)

这是一个有效的例子: