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是唯一的
问题
基本上我注意到两个问题:
更多证据
在我的图表上,我设置了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;});
此功能是否将某些数据点加在一起?
答案 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; })