【问题标题】:dc.js crossfilter without reducedc.js 没有减少的交叉过滤器
【发布时间】:2016-02-17 06:25:08
【问题描述】:

交叉过滤器是否在操纵我的数据?

背景

我已经执行了服务器端所需的所有处理,并且只想准确地绘制 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;
        })

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

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

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

【问题讨论】:

    标签: reduce dc.js crossfilter


    【解决方案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; })
    

    【讨论】:

    • 有趣。你是对的,由于某种原因,norm_1 并不是很独特。感谢您帮助我理解 reduceSum 并建议新的键值访问器模式。我实际上需要将 norm_1 修复为唯一。
    • 有没有办法在 norm_1 不唯一时对数据进行平均(以防它再次发生)
    • 当然,看看FAQannotated stock example 中的第一个示例。基本上它是一个运行计数除以运行计数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 2017-06-05
    相关资源
    最近更新 更多