Crossfilter和D3:按组and维度进行过滤

Crossfilter and D3: Filter by group AND dimension

本文关键字:过滤 and D3 按组 Crossfilter      更新时间:2023-09-26

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

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

我看到的问题是,我不能同时识别两个过滤器,或者我不知道如何正确绑定d3.data()

我知道我可以创建一个新的"特别"维度,但由于维度很昂贵,这可能不是最好的方法。

有什么想法吗?

问题不在于交叉过滤器的使用,而在于d3显示器。由于您没有使用交叉过滤器进行品牌过滤,因此可以使用该维度来获取结果(然而,在同一维度上不会观察到任何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

您可以将数据作为.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传递给.data(),并对另一个使用索引。

此处列出的两个选项:

d3阵列输入线图示例

这里有一个前者的详细例子:

http://bl.ocks.org/patrickberkeley/9162034

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