crossfilter:如何同时使用crossfilters作为开始日期和结束日期列

时间:2016-02-05 10:05:10

标签: javascript dc.js crossfilter

我遇到与此question类似的情况。考虑相同的数据集,我如何通过交叉过滤器执行此功能。我是dc.js和crossfilter的新手。我正在尝试实现此example中的条形图和区域图。即使这个例子也使用了1个日期列。我只能用startdate来做。但是,我的要求是根据startdate和enddate过滤数据集。我找不到很多谈论同一问题的资源。

任何帮助和建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

您可能希望这很简单,但实际上跟踪间隔是计算机科学的一个典型棘手问题,它需要一个称为demo的专门数据结构才能正确完成。

这是一个非常常见的请求,因此出于好奇,我找到了间隔树和interval tree的JavaScript库。

我已将其合并到found one by Mikola Lysenko中。 (new example here

该示例的重要部分首先是使用groupAll填充区间树:

      projectsPerMonthTree = ndx.groupAll().reduce(
          function(v, d) {
              v.insert(d.interval);
              return v;
          },
          function(v, d) {
              v.remove(d.interval);
              return v;
          },
          function() {
              return lysenkoIntervalTree(null);
          }
      )

接下来,我们使用开始日期和结束日期填充假组,计算与每个月相交的所有区间:

  function intervalTreeGroup(tree, firstDate, lastDate) {
      return {
          all: function() {
              var begin = d3.time.month(firstDate), end = d3.time.month(lastDate);
              var i = new Date(begin);
              var ret = [], count;
              do {
                  next = new Date(i);
                  next.setMonth(next.getMonth()+1);
                  count = 0;
                  tree.queryInterval(i.getTime(), next.getTime(), function() {
                      ++count;
                  });
                  ret.push({key: i, value: count});
                  i = next;
              }
              while(i.getTime() <= end.getTime());
              return ret;
          }
      };
  }

      projectsPerMonthGroup = intervalTreeGroup(projectsPerMonthTree.value(), firstDate, lastDate),

(如果我们使用较低级别的区间树访问权限,或者如果它有一个更加丰富的API允许按顺序遍历间隔,这可能更简单,更便宜。但这应该足够快。)

最后,我们设置filterFunction,以便我们选择与给定日期范围相交的间隔:

  monthChart.filterHandler(function(dim, filters) {
      if(filters && filters.length) {
          if(filters.length !== 1)
              throw new Error('not expecting more than one range filter');
          var range = filters[0];
          dim.filterFunction(function(i) {
              return !(i[1] < range[0].getTime() || i[0] > range[1].getTime());
          })
      }
      else dim.filterAll();
      return filters;
  });

我已将其设置为过滤月份图表以显示与其自己的日期范围相交的所有项目。如果不需要,groupAll可以放在intervalDimension上。

答案 1 :(得分:0)

解决方案确实非常简单。创建两个维度:

  1. 按开始时间-startTimeDim
  2. 截止时间-endTimeDim

现在,要滤除与给定范围-rangeStartrangeEnd相交的间隔,请应用以下内容:

  1. startTimeDim.filter([-Infinity, rangeEnd])
  2. endTimeDim.filter([rangeStart, Infinity])

这基本上可以过滤掉在范围结束之前开始和在范围开始之前结束的间隔。