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