gpt4 book ai didi

crossfilter - 交叉过滤器维度计数的 DC.js 直方图

转载 作者:行者123 更新时间:2023-12-01 02:21:41 24 4
gpt4 key购买 nike

我有一个输入以下数据结构的交叉过滤器。

project | subproject | cost
data = [
["PrA", "SubPr1", 100],
["PrA", "SubPr2", 150],
["PrA", "SubPr3", 100],
["PrB", "SubPr4", 300],
["PrB", "SubPr5", 500],
["PrC", "SubPr6", 450]]

我可以创建一个具有每个项目总成本的条形图:
var ndx = crossfilter(data)
var projDim = ndx.dimension(function(d){return d.project;});
var projGroup = costDim.group().reduceSum(function(d){return d.budget;});

我想要做的是按项目成本创建一个 dc.js 直方图...所以 {450: 2, 300: 1} 等。据我所知,crossfilter 只能输入每一行的属性尺寸。有没有解决的办法?

最佳答案

接受挑战!

确实,crossfilter 不支持这种双归约,但是如果您愿意接受轻微的效率损失,您可以创建具有所需行为的“假维度”和“fake groups”。幸运的是,dc.js 并没有使用太多的 crossfilter API,所以你不必实现太多的方法。

技巧的第一部分是复制维度和组,这样新维度和旧维度将各自观察到另一个维度的过滤。

第二部分是创建假组和维度,它们遍历复制组的箱,并根据值而不是键重新合并和重新过滤。

一般解决方案的开始如下。对于某些图表,还需要实现 group.top() ,通常可以将其转发到 group.all() .

function values_dimension(dim, group) {
return {
filter: function(v) {
if(v !== null)
throw new Error("don't know how to do this!");
return dim.filter(null);
},
filterFunction: function(f) {
var f2 = [];
group.all().forEach(function(kv) {
if(f(kv.value))
f2.push(kv.key);
});
dim.filterFunction(function(k) {
return f2.indexOf(k) >= 0;
});
return this;
}
};
}

function values_group(group) {
return {
all: function() {
var byv = [];
group.all().forEach(function(kv) {
if(kv.value === 0)
return;
byv[kv.value] = (byv[kv.value] || 0) + 1;
});
var all2 = [];
byv.forEach(function(d, i) {
all2.push({key: i, value: d});
});
return all2;
}
};
}

// duplicate the dimension & group so each will observe filtering on the other
var projDim2 = ndx.dimension(function(d){return d.project;});
var projGroup2 = projDim2.group().reduceSum(function(d){return d.budget;});
var countBudgetDim = values_dimension(projDim2, projGroup2),
countBudgetGroup = values_group(projGroup2);

jsfiddle在这里: http://jsfiddle.net/gordonwoodhull/55zf7L1L/

关于crossfilter - 交叉过滤器维度计数的 DC.js 直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19989510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com