Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 交叉过滤器在dc.js上显示负数,数据集中没有负数_Javascript_Dc.js_Crossfilter - Fatal编程技术网

Javascript 交叉过滤器在dc.js上显示负数,数据集中没有负数

Javascript 交叉过滤器在dc.js上显示负数,数据集中没有负数,javascript,dc.js,crossfilter,Javascript,Dc.js,Crossfilter,我正在使用CrossFilter和dc.js创建4个不同的条形图,并允许用户使用图表上的画笔功能更改数据,因此当用户更改一个图表上的画笔时,其他图表会动态更改 这对我来说是一个有趣的问题,CrossFilter或dc.js似乎在图上放置负值,但只有在选择了图的某些部分时 因此,正如您从图像中看到的,当我选择一个图表中似乎没有值的区域时,其他图表中会显示负值 我的数据中有四项:日期、类型(字符串)、值(数字)和分组值(这是分组为50个较小值块的值) 然后我在每个数据块上有4个维度和4个组,这些被

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

这对我来说是一个有趣的问题,CrossFilter或dc.js似乎在图上放置负值,但只有在选择了图的某些部分时

因此,正如您从图像中看到的,当我选择一个图表中似乎没有值的区域时,其他图表中会显示负值

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

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

我的数据中从来没有任何负值,那么我的图表怎么会显示负值呢

我对CrossFilter和dc.js不太熟悉,所以我不确定这里要展示的最佳方法或最佳代码片段,如果有其他东西我应该分享,请让我知道,我真的需要帮助来理解为什么我的图中有负数

编辑:添加代码

以下是我的数据示例:

[{“Id”:“1”,“InDate”:“31/10/2015”,“Type”:“New”,“cat1”,“Value”:“1.400874145”}, {“Id”:“2”,“InDate”:“21/10/2014”,“Type”:“Old”,“Category”:“cat2”,“Value”:“0”}]

我使用d3.csv函数从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:添加JSFIDLE


Fiddle-

看起来这些是无穷小的负数,这可能表示浮点数没有完全抵消所导致的故障

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

由于交叉滤波器可能会以不同的顺序从值的加法中减去值,并且加法的顺序也不一定确定,因此经常会出现这种问题

我建议创建一个假组包装您的数据,并在非常接近时将值设置为零:

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

您的交叉筛选分组代码中可能存在错误,但您需要与我们共享代码以帮助您。@EthanJewett-谢谢,我添加了代码,其中显示了数据片段,以及如何设置维度和分组,然后,我在dc.js中以最基本的方式使用这些维度和组,但是如果您需要查看一些图表代码,请告诉我,我会添加它。添加了一个显示问题的提琴,我没有尽快返回。我很高兴事情解决了@戈登是这件事的主谋。
chart.group(snap_to_zero(valueGrouped))