我尝试使用crossfilter
同时在维度和组上过滤我的数据。
说,我希望能够filterExact
在我的" byCylinders"尺寸,同时过滤我的groupByBrand
组的价值(根据品牌名称减少汽车数量)。
(两个复选框都已选中)。
参见代码: http://jsbin.com/xajuc/2/watch?js,output
我发现的问题是,我不能立即识别这两个过滤器,或者我不明白如何正确绑定d3.data()
。
我知道我可以创建一个新的" ad-hoc"尺寸,但由于尺寸昂贵,这可能不是最好的方法..
有什么想法吗?
答案 0 :(得分:1)
问题不在于你使用crossfilter,而在于你的d3显示器。由于您没有使用crossfilter进行品牌过滤,因此可以使用该维度来获取结果(但不会在同一维度上观察任何dimension.filter
)。
问题是您没有更改但未删除的容器的更新步骤。 Crossfilter不会自动删除包含0个项目的垃圾箱,因此实际的垃圾箱数量不会因您的byCylinders.filter
而变化,只会改变尺寸。因此,只需单击圆柱体复选框就没有进入或退出 - 只有另一个过滤器实际上移除了圆柱体。
因此,通过在插入后添加更新步骤,您可以看到数字更改:
var result = d3.select("body")
.select("div#result")
.selectAll("div")
.data(resultData);
result.enter()
.append("div");
result
.text(function(d){
return d.key + " : " + d.value + " cars found";});
这利用了.enter()
中的项目在处理后立即可用于更新的事实。
答案 1 :(得分:0)
您可以将数据作为.json引入,压缩各种数据元素,并将.data()传递给整个数据集。我认为以下内容也适用于您的过滤器。我将解释这一点,就像你带来的数据(不一定是过滤的)作为一个整体。希望这将有助于阐明.data()如何与d3中的关联数据一起使用。
data.json示例:
{
"property1":[0, 0, 0, 0],
"property2":['name1', 'name2', 'name3', 'name4']
}
以.json:
的形式输入数据d3.json("data.json", function(data) {
// zip the two (or more) attributes of your data
data = d3.zip(data.property1, data.property2).map(function(d) {
property1 = +d[0];
property2 = +d[1];
// return object for each property
return {prop1: property1, prop2: property2};
});
}
然后.data()可以获得该zip:
.data(data)
您一次只能调用其中一个数据属性:
// histogram example
d3.layout.histogram()
.bins()
.value( function(d) { return d.attr1; })
(data)
您是否看到.value
如何仅返回zip的一个属性?但其他财产仍然有关联。您可以拥有多个属性,使用一些属性进行您可能正在进行的任何计算,然后将其他属性用作这些数据属性的元数据,因为它们都是在一个很好的小包中压缩在一起的。
另一种选择是将一个数组/数据传递给.data()并使用另一个数据/索引。
这里列出了两个选项:
d3 array input line graph example
前面有一个前者的详细例子:
http://bl.ocks.org/patrickberkeley/9162034
我认为这些概念就是你所追求的。如果我错了,请告诉我。