Crossfilter和D3:按组和维度过滤

时间:2014-10-21 15:18:57

标签: javascript d3.js dc.js crossfilter

我尝试使用crossfilter同时在维度和组上过滤我的数据。 说,我希望能够filterExact在我的" byCylinders"尺寸,同时过滤我的groupByBrand组的价值(根据品牌名称减少汽车数量)。 (两个复选框都已选中)。

参见代码: http://jsbin.com/xajuc/2/watch?js,output

我发现的问题是,我不能立即识别这两个过滤器,或者我不明白如何正确绑定d3.data()

我知道我可以创建一个新的" ad-hoc"尺寸,但由于尺寸昂贵,这可能不是最好的方法..

有什么想法吗?

2 个答案:

答案 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()中的项目在处理后立即可用于更新的事实。

http://jsbin.com/qesafu/2/edit

答案 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

我认为这些概念就是你所追求的。如果我错了,请告诉我。