Crossfilter维度和组,用于过滤低于特定阈值的数据

时间:2015-03-17 18:42:58

标签: dc.js crossfilter

我有以下数据,我正在尝试绘制2个条形图:

  • 给定类型的总单位数
  • 类型小于2.0的单位

两个图表中的x轴都是单位的类型。

图表很好。问题是:

当我选择第二张图表上的栏时,我希望只看到版本为<数据表和第一个图表中的2.0,即这种情况下的一个记录。但我得到的是该特定类型的所有单位(如果我点击第一张图表中的条形图,这就是我所期望的),即3条记录。

请参阅http://jsfiddle.net/y1o52tk4/6/

我想问的问题是我如何分组版本图表:

var versionGroup = type1Dim.group().reduceSum(dc.pluck('version_count'));

数据:

var data = [{
         "version": 1.0,
         "serial": '1A',
         "type": "a"
},{
         "version": 2.0,
         "serial": '2A',
         "type": "a"
},{
         "version": 2.0,
         "serial": '2AA',
         "type": "a"
},{
         "version": 2.0,
         "serial": '2B',
         "type": "b"
},{
         "version": 2.5,
         "serial": '25B',
         "type": "b"
},{
         "version": 1.0,
         "serial": '1B',
         "type": "b"
}];

2 个答案:

答案 0 :(得分:3)

这里的问题是您创建了小于2的自定义版本数,并在条形图中绘制了该数量。 Crossfilter不知道反向指的是什么。因此,当您点击区域中的第二个图表时,' b' crossfilter将.filter(" b")应用于该维度,然后应用crossfilter对象。因此你的输出是正确的。要做你想做的事情,我建议你添加一个新的维度

var versionDim = ndx.dimension(function(d) {return d.version});

然后在第二个图表中添加一个onfiltered侦听器 此侦听器检查您是否尝试过滤第二个图表,如果是,则在我上面创建的新维度上应用过滤器。

.on("filtered", function(chart){
    if(typeDim.top(ndx.size()).length) < ndx.size())
    {
        versionDim.filter(1);
    }else{
        versionDim.filterAll();
    }
})

答案 1 :(得分:3)

正如上面的评论所述,但让我们拼出来并澄清一些事情。

您可以使用复合键,然后使用&#34;假组&#34;过滤组,就像您在上面更新的小提琴中所做的那样,以获得此效果。这可能是最常用,最稳定的方式,无需做任何UI黑客攻击。

然而,要了解有关交叉滤波器密钥的事情是它始终会强制它们使用值。因此,如果你想要一个复合键,最好自己将它构造成一个字符串,因为如果你将它作为一个数组传递,crossfilter会将它强制转换为一个字符串并给你一个{{1}的连接} - 可以使用,我知道dc.js散点图可以做到这一点,但我不推荐它。它比自己创建字符串效率低(因为你只会做一次而不是在crossfilter内部发生它),并且因为你有更多的控制权。

与Jason Davies进行了长时间的讨论,让我信服: https://github.com/square/crossfilter/pull/48

所以这里是你的小提琴的字符串连接复合键版本。

首先是复合键:

,

(最简单的分隔符为 var type1Dim = ndx.dimension(function(d){ if(d.version<2.0) return '1.' + d.type; else return '2.' + d.type;}); ,但'\x0'在这里正常工作。)

接下来,一个普通密钥访问者:

'.'

我们让dc.js推断出有序量表的范围:

    .keyAccessor(function(d) {return d.key;})

它确实有效,但现在滴答声有丑陋的复合键。解决这个问题:

    .x(d3.scale.ordinal());

我的前叉:http://jsfiddle.net/gordonwoodhull/y09cok1z/4/

编辑:我忘了更新假组生成器,这在这里不重要,但为了一般性,它也应该拆分密钥:

    versionChart.xAxis().tickFormat(function(d) {
        return d.split('.')[1];
    });