dc.js - 每天从组中获得的最小值

时间:2014-08-28 11:08:22

标签: dc.js crossfilter

我有以下数据结构,并希望按日(日期)(维度)显示最小值'amount'(组)的lineChart。

var data = [
 {date: "2014-01-01", amount: 10},
 {date: "2014-01-01", amount: 1},
 {date: "2014-01-15", amount: 0},
 {date: "2014-01-15", amount: 10 },
 {date: "2014-02-20", amount: 100 },
 {date: "2014-02-20", amount: 10 },
];

我通常会按照以下方式做一些事情,但我不确定如何在小组中找到分数。

var dateDim = facts.dimension(function (d) {return d3.time.day(d.date);});
var dateDimGroup = dateDim.group().reduceSum(function (d) { return d.amount; })

这可能吗?我似乎无法找到任何这方面的例子,所以任何帮助都会非常感激。

谢谢!

1 个答案:

答案 0 :(得分:4)

您需要保留自定义分组。基本思想是维护组中所有值的数组(最佳排序)。在您的添加功能中,您将获得数组的当前值,并将第一个值分配给' min'该集团的财产。在删除功能中删除值,从数组中删除当前值,然后将第一个值分配给' min' property(并检查列表是否为空,在这种情况下将其设置为undefined或沿着这些行的某些内容)。

你的功能看起来像这样:

function add(accessor) {
    var i;
    var bisect = crossfilter.bisect.by(function(d) { return d; }).left;
    return function (p, v) {
        // Not sure if this is more efficient than sorting.
        i = bisect(p.valueList, accessor(v), 0, p.valueList.length);
        p.valueList.splice(i, 0, accessor(v));
        p.min = p.valueList[0];
        return p;
    };
};
function remove(accessor) {
    var i;
    var bisect = crossfilter.bisect.by(function(d) { return d; }).left;
    return function (p, v) {
        i = bisect(p.valueList, accessor(v), 0, p.valueList.length);
        // Value already exists or something has gone terribly wrong.
        p.valueList.splice(i, 1);
        p.min = p.valueList[0];
        return p;
    };
};
function initial() {
    return function () {
        return {
            valueList: [],
            min: undefined
        };
    };
}

'存取'是一个函数来获得你想要的最小值,比如reduceSum。调用这些函数中的每一个以返回您在.group(添加,删除,初始化)函数中相应位置使用的函数。

此代码几乎完全脱离了reductio,因此您也可以使用reductio并执行:

var dateDim = facts.dimension(function (d) {return d3.time.day(d.date);}); var dateDimGroup = reductio().min(function (d) { return d.amount; })(dateDim.group());

你的dateDimGroup将会有一个' min'应该为您提供每个日期的最低金额的财产。