【问题标题】:Plotting averages with dc.js / crossfilter使用 dc.js / crossfilter 绘制平均值
【发布时间】:2015-06-17 13:27:54
【问题描述】:

我有一些这样的数据

[
    {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 只是额外的成本;最后它弄乱了每种类型的计数。

【问题讨论】:

    标签: javascript dc.js crossfilter


    【解决方案1】:

    试试这个:

    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;
    }
    

    【讨论】:

    • 我想我的问题措辞不是很清楚。我确实实现了平均功能,我想知道的是如何在不创建交叉过滤器中的“索引”维度的情况下绘制数组。到目前为止,我将尝试编辑我的问题。
    • 事实上,整个一般的事情都是不必要的细节,但你的回答可能对未来的访问者有用,所以我将发布另一个问题(用更好的措辞和更多的代码)
    猜你喜欢
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多