我正在使用CrossFilter和dc.js来创建4个不同的条形图,并允许用户通过使用图表上的画笔功能来更改数据,因此当用户更改一个图表上的画笔时,其他用户会动态更改。
这一切都在我在分钟栏工作一个有趣的问题,它看起来像Crossfilter或DC.JS在图中放置负值,但只有在选择图形的某些部分时。
因此,从图像中您可以看到,当我选择图表中似乎没有任何值的区域时,这在其他图表中显示为负值。
我的数据中有四个项目,日期,类型(字符串),值(数字)和分组值(这是将值分组为较小的值50的小块)
然后,我在每个数据上有4个维度,并在4个组中提供了这些维度,并将这些维度提供给图表。
我的数据中永远不会有任何负值,那么我的图表如何显示负值?
我是CrossFilter和dc.js的新手,所以我不确定在此处显示的最佳方法或最佳代码片段,如果还有其他应分享的内容,请告诉我,我真的需要帮助以了解为什么我的图表中有负数。
编辑:添加代码
这是我的数据的示例:
我是从CSV文件中使用d3.csv函数读取的。我对CSV文件中的负值进行了三重检查。
这是我设置尺寸的方法:
var ndx = crossfilter(data);
var parseDate = d3.time.format("%d/%m/%Y").parse;
data.forEach(function(d) {
d.date = parseDate(d.InDate);
d.valueGrouped = createValueGrouping(parseFloat(d.Value));
});
var dateDim = ndx.dimension(function(d) {return d.date;});
var typeDim = ndx.dimension(function(d) {return d.Type;});
var valueGroupDim = ndx.dimension(function(d) {return d.valueGrouped;});
var categoryDim = ndx.dimension(function(d) {return d.Category;});
这是创建valueGrouped属性的函数:
function createValueGrouping(value){
return 50 * Math.round(value/50);
}
最后,这是我如何设置组:
var timelineGroup = dateDim.group().reduceSum(function(d) {return parseFloat(d.Value);});
var typeGroup = typeDim.group().reduceSum(function(d) {return parseFloat(d.Value);});
var valueGrouped = valueGroupDim.group().reduceSum(function(d) {return parseFloat(d.Value);});
var categoryGroup = categoryDim.group().reduceSum(function(d) {return parseFloat(d.Value);});
编辑2:添加JSFiddle
fiddle -JSFiddle
最佳答案
看起来这些是无穷大的负数,这可能表明由浮点数不能完全抵消而引起的毛刺。
当您添加幅度变化很大的浮点数时,这些操作不一定是关联的或分布的,这意味着如果以不同的顺序添加数字,您将获得不同的结果。
https://en.m.wikipedia.org/wiki/Floating_point#Accuracy_problems
由于交叉滤波器可能会以与值相加的顺序不同的方式减去值,并且也不一定要定义相加的顺序,因此经常会出现这种问题。
我建议创建一个伪造的组来包装您的数据,并在它们非常接近时将值设置为零:
function snap_to_zero(source_group) {
return {
all:function () {
return source_group.all().map(function(d) {
return {key: d.key,
value: (Math.abs(d.value)<1e-6) ? 0 : d.value};
});
}
};
}
无论您在哪里遇到问题,都可以使用此功能将原始组包裹起来:
chart.group(snap_to_zero(valueGrouped))
关于javascript - 交叉过滤器在dc.js上显示负数,数据集中没有负数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29232203/