javascript - Crossfilter - 无法从其他组(不是来自关联组)获取过滤记录

标签 javascript crossfilter

我正在使用此引用文献中的“飞机”数据集 http://square.github.io/crossfilter/

date,delay,distance,origin,destination
01010001,14,405,MCI,MDW
01010530,-11,370,LAX,PHX
...

  // Create the crossfilter for the relevant dimensions and groups.
  var flight = crossfilter(flights),
      all = flight.groupAll(),
      date = flight.dimension(function(d) { return d.date; }),
      dates = date.group(d3.time.day),
      hour = flight.dimension(function(d) { return d.date.getHours() + d.date.getMinutes() / 60; }),
      hours = hour.group(Math.floor),
      delay = flight.dimension(function(d) { return Math.max(-60, Math.min(149, d.delay)); }),
      delays = delay.group(function(d) { return Math.floor(d / 10) * 10; }),
      distance = flight.dimension(function(d) { return Math.min(1999, d.distance); }),
      distances = distance.group(function(d) { return Math.floor(d / 50) * 50; });

正在关注 document of Crossfilter, "groups don't observe the filters on their dimension"=> 此时我们可以从他们的维度未被过滤的组中获取过滤记录,不是吗?

我已经进行了一些测试,但这是不正确的:

  console.dir(date.group().all()); // 50895 records
  console.dir(distance.group().all()); // 297 records

  date.filter([new Date(2001, 1, 1), new Date(2001, 2, 1)]);

  console.dir(date.group().all()); // 50895 records => this number still the same because we are filtering on its dimension
  console.dir(distance.group().all()); // 297 records => but this number still the same too. I don't know why
  1. 你能为我解释一下为什么“distance.group().all()”的数量仍然和我们执行过滤器之前一样吗?我在这里遗漏了什么吗?

  2. 如果真的不能通过这种方式从“距离维度”得到“筛选记录”,我该如何实现?

谢谢。

最佳答案

所以,是的,这是预期的行为。

Crossfilter 将通过应用维度键和组键函数为它找到的每个值在组中创建一个“bin”。然后,当应用过滤器时,它将应用 reduce-remove 函数,默认情况下减去删除的行数。

结果是空 bin 仍然存在,但它们的值为 0。

编辑:这里是the Crossfilter Gotchas entry with further explanation .

如果你想删除零,你可以使用“假组”来做到这一点。

function remove_empty_bins(source_group) {
    return {
        all:function () {
            return source_group.all().filter(function(d) {
                //return Math.abs(d.value) > 0.00001; // if using floating-point numbers
                return d.value !== 0; // if integers only
            });
        }
    };
}

https://github.com/dc-js/dc.js/wiki/FAQ#remove-empty-bins

此函数将组包装在一个对象中,该对象通过调用 source_group.all() 实现 .all(),然后过滤结果。因此,如果您使用的是 dc.js,您可以像这样向您的图表提供这个假组:

chart.group(remove_empty_bins(yourGroup));

关于javascript - Crossfilter - 无法从其他组(不是来自关联组)获取过滤记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53425052/

相关文章:

javascript css3 每 2 秒更改一次背景颜色

javascript - 如何配置 Google Analytics 以将 URL 参数作为单独的页面进行跟踪

javascript - 如何让for循环等待函数在javascript中执行

dc.js - 每天来自组的最小值

javascript - crossfilter 实例是可变的还是不可变的?

javascript - 如何在 Bookshelf.js 中执行多连接查询?

javascript - 如何使用 dc.js 在饼图中心显示值

javascript - 是否可以将过滤器应用于特定维度?

javascript - 如何在 dc.js 中禁用 rowChart 上的点击事件

javascript - 实现如下滚动页眉效果及效果名称?