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
看起来这些是无穷小的负数,这可能表示浮点数不能完全抵消引起的故障.
当您添加幅度变化很大的浮点数时,操作不一定是关联的或分布式的,这意味着如果以不同的顺序添加数字,您将得到不同的结果.
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)
| 归档时间: |
|
| 查看次数: |
1089 次 |
| 最近记录: |