dc.js crossfilter没有减少

时间:2016-02-17 06:25:08

标签: reduce dc.js crossfilter

crossfilter是否操纵我的数据?

背景

我已经执行了我需要服务器端的所有处理,并且只想准确描绘json管道的内容。到目前为止,我已经让图表完全符合我的要求,除非我的数据似乎正在被操纵。

这是我的crossfilter代码:

ndx = crossfilter(rData);
runDimension = ndx.dimension(function (d) { return [+d.series, +d.norm_1]; });
runGroup = runDimension.group();
runGroup.reduceSum(function (d) { return d.value;});

注意:norm_1是唯一的

问题

基本上我注意到两个问题:

  1. 我知道我的所有数据都介于-1和1之间(我已经运行了几次检查来测试它),但是在绘制它时我看到它在某些地方下降到-1.4。 / LI>
  2. 我的服务器只发送了1000行数据,但通过查看某些dc.js代码,我发现它只能绘制752行。
  3. 更多证据

    在我的图表上,我设置了valueAccessor并添加了一些检查以测试超出范围的值,我可以非常清楚地看到它消失了:

            .valueAccessor(function (d) {
                if (d.value > 1 || d.value < -1) {
                    console.log(d);
                }
                return d.value;
            })
    

    来自服务器的数据在进入交叉过滤器之前需要少量格式化(它作为表格下来并需要拆分为系列对象)。我用这个机会来测试数据是否超出范围,我可以清楚地看到它保持在界限内:

        for (var i = 0; i < $scope.remoteData.rows.length; i++) {
            for (var j = 0; j < $scope.remoteData.labels.length; j++) {
                var label = $scope.remoteData.labels[j];
                var value = $scope.remoteData.rows[i][label];
                if (value > 1 || value < -1) {
                    console.log({
                        label: label,
                        i: i,
                        series: j,
                        norm_1: $scope.remoteData.rows[i].norm_1,
                        value: value,
                    });
                }
                rData.push({
                    series: j,
                    norm_1: $scope.remoteData.rows[i].norm_1,
                    value: value
                })
            }
        } 
    

    讨论

    我怀疑我的问题与以下内容有关:

    runGroup.reduceSum(function (d) { return d.value;});
    

    此功能是否将某些数据点加在一起?

1 个答案:

答案 0 :(得分:1)

听起来有些行[+d.series, +d.norm_1]不是唯一的。是的,具有相同密钥的任何行都将添加reduceSum

我建议你的维度键是非常独特的。

如果您没有唯一的密钥,只需更多的工作就可以使用数组索引本身作为维度密钥。这意味着您必须在任何地方使用键和值访问器来回顾原始数组。

类似的东西:

ndx = crossfilter(d3.range(0, rData.length));
runDimension = ndx.dimension(function(d) { return d; })
runGroup = runDimension.group().reduceSum(function(d) { 
    return rData[d].value;
})

chart.keyAccessor(function(kv) { return rData[kv.key].x; })
     .valueAccessor(function(kv) { return rData[kv.key].y; })