使用 dc.js / crossfilter 绘制平均值
Plotting averages with dc.js / crossfilter
我有这样的数据
[
{type:"a", series:[0.1, 0.2, 0.2, 0.1, -0.1]},
{type:"b", series:[0.3, 0.4, 0.5, 0.6, 0.7]},
]
类型有一个维度,然后我正在做一个组,然后对每个类型的每个系列进行平均。
有没有一种很好的方法来绘制每种类型的平均系列?显然,我希望它使用任何新过滤器进行更新。
我尝试将数据展平为
[
{type:"a", index:0, value:0.1},
{type:"a", index:1, value:0.2},
...
]
并将索引也作为一个维度。但是当我添加更多数据时它变得有点慢;我从不过滤索引维度,所以将它添加到 crossfilter 只是一个额外的成本;最后它弄乱了每种类型的计数。
试试这个:
var group = typeDimension.group().reduce(reduceAdd, reduceRemove, reduceInitial);
function reduceAdd(p, v) {
++p.count
p.sum += calculateAverage(v['series']);
p.avg = p.sum / p.count;
return p;
}
function reduceRemove(p, v) {
--p.count
p.sum -= calculateAverage(v['series']);
p.avg = p.sum / p.count;
return p;
}
function reduceInitial() {
return {count: 0, sum: 0, avg: 0};
}
function calculateAverage(numbers) {
var sum = 0;
number.forEach(function(num) {
sum += num;
});
return sum / numbers.length;
}
我有这样的数据
[
{type:"a", series:[0.1, 0.2, 0.2, 0.1, -0.1]},
{type:"b", series:[0.3, 0.4, 0.5, 0.6, 0.7]},
]
类型有一个维度,然后我正在做一个组,然后对每个类型的每个系列进行平均。
有没有一种很好的方法来绘制每种类型的平均系列?显然,我希望它使用任何新过滤器进行更新。
我尝试将数据展平为
[
{type:"a", index:0, value:0.1},
{type:"a", index:1, value:0.2},
...
]
并将索引也作为一个维度。但是当我添加更多数据时它变得有点慢;我从不过滤索引维度,所以将它添加到 crossfilter 只是一个额外的成本;最后它弄乱了每种类型的计数。
试试这个:
var group = typeDimension.group().reduce(reduceAdd, reduceRemove, reduceInitial);
function reduceAdd(p, v) {
++p.count
p.sum += calculateAverage(v['series']);
p.avg = p.sum / p.count;
return p;
}
function reduceRemove(p, v) {
--p.count
p.sum -= calculateAverage(v['series']);
p.avg = p.sum / p.count;
return p;
}
function reduceInitial() {
return {count: 0, sum: 0, avg: 0};
}
function calculateAverage(numbers) {
var sum = 0;
number.forEach(function(num) {
sum += num;
});
return sum / numbers.length;
}