我有以下数据结构,并希望按天(日期)(维度)显示具有最小值“金额”(组)的折线图。
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; })
这可能吗?我似乎找不到任何这样的例子,所以任何帮助都将不胜感激。
谢谢!
最佳答案
您将需要保留自定义分组。基本思想是您维护一个组中所有值的数组(有序是最好的)。在您的 add 函数中,您将当前值分配给数组并将第一个值分配给组的“min”属性。在删除函数中,删除值,从数组中删除当前值,然后将第一个值分配给 'min' 属性(并检查列表是否为空,在这种情况下将其设置为 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
};
};
}
'accessor' 是一个函数,用于获取您想要的最小值,就像在 reduceSum 中一样。调用这些函数中的每一个以返回您在 .group(add, remove, initial) 函数中相应位置使用的函数。
这段代码几乎是直接从 reductio 中撕下来的,所以你也可以使用 reduceio 并执行以下操作:
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' 属性,它应该为您提供每个日期的最低金额。
关于dc.js - 每天组的最小值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25547347/