Crossfilter在dc.js上显示负数,数据集中没有负数

Don*_*rty 5 javascript crossfilter dc.js

我使用CrossFilter和dc.js来创建4个不同的条形图,并允许用户使用图表上的画笔功能更改数据,因此当用户在一个图表上更改画笔时,其他图表会动态更改.

这一切都在我的分钟栏上工作一个有趣的问题,看起来像CrossFilter或dc.js在图表上放置负值但仅在选择图表的某些部分时.

因此,当我选择图表中似乎没有值的区域时,从图像中可以看到,这会在其他图表中显示负值.

在此输入图像描述

我的数据中有四个项目,日期,类型(字符串),值(数字)和分组值(这是分组为较小块值50的值)

然后我在每个数据和4个组上有4个维度,这些维度提供给图表.

我的数据中从不存在任何负值,因此我的图表如何显示负值?

我是CrossFilter和dc.js的新手,所以我不确定最好的方法或最好的代码片段在这里展示,如果还有别的东西我应该分享请告诉我,我真的需要帮助试图理解为什么我的图表中有负数.

编辑:添加代码

以下是我的数据示例:

[{"Id":"1","InDate":"2015年10月31日","类型":"新","类别":"cat1","值":"1.400874145"},{"我":" 2" , "铟酸": "21/10/2014", "类型": "老", "类别": "CAT2", "值": "0"}]

我使用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;});
Run Code Online (Sandbox Code Playgroud)

这是创建valueGrouped属性的函数:

function createValueGrouping(value){
    return 50 * Math.round(value/50);
}
Run Code Online (Sandbox Code Playgroud)

最后,我将如何设置组:

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);});
Run Code Online (Sandbox Code Playgroud)

编辑2:添加JSFiddle

小提琴 - JSFiddle

Gor*_*don 6

看起来这些是无穷小的负数,这可能表示浮点数不能完全抵消引起的故障.

当您添加幅度变化很大的浮点数时,操作不一定是关联的或分布式的,这意味着如果以不同的顺序添加数字,您将得到不同的结果.

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};
            });
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

无论您遇到什么问题,都可以使用此功能包裹原始组:

chart.group(snap_to_zero(valueGrouped))
Run Code Online (Sandbox Code Playgroud)