dc.js 没有减少的交叉过滤器

dc.js crossfilter without reduce

crossfilter 是否在操纵我的数据?

背景

我已经执行了服务器端所需的所有处理,只想准确绘制 json 管道中的内容。到目前为止,我已经让图表完全按照我想要的方式工作,除了它似乎正在操纵我的数据。

这是我的交叉过滤器代码:

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一些地方。
  2. 我的服务器刚好发送了 1000 行数据,但是通过断点一些 dc.js 代码我可以看到它只绘制了 752 行。

更多证据

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

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

来自服务器的数据在进入交叉过滤器之前需要进行少量格式化(它归结为 table 并且需要拆分为系列对象)。我以此为契机来测试数据是否超出范围,我可以清楚地看到它保持在范围内:

    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;});

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

听起来有些行 [+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; })