我正在使用crossfilter.js,d3.js和dc.js创建一些仪表板,但是当数据集的值为" 0&#34时我遇到了一些问题;
在仪表板中有一个dc.geoChoroplethChart(),我使用.colorCalculator()来区分过滤后的值:如果定义了d但不是0使用颜色,否则使用#666
.colorCalculator(function (d) {
return d ? map.colors()(d) : '#666';
})
问题是:
我无法区分值是 0 ,因为它必须是 0 ,或者因为它不尊重过滤器!
[实施例]
我已经制作了一个超级简单的jsfiddle来显示问题http://jsfiddle.net/danielepennati/77pqh/
数据集是这样的:
{id:"a1", tipo: "a", val: 0},
{id:"a2", tipo: "a", val: 1},
{id:"a3", tipo: "a", val: 2},
...
有两个维度(一个是id,一个是tip),另一个是id维度
首先,我只打印id组的输出
如果单击按钮,则在" tipo"过滤后,您将获得相同id组的输出。 =" a" 到tipo维度。
你可以在小提琴中看到" id" =" a1" ,这是过滤维度的一部分,因为它有" tipo" =" a" ,具有相同的0值(因为它是它自己的值)作为不属于过滤维度的其他记录(b1,b2,b3,...,c4) ,c5)
这是我在dc.geoChoroplethChart()中输出的相同类型的输出,我通过单击仪表板中的另一个图表添加过滤器并且无法处理值= 0 < / em>正确:
[UPDATE]
我试图检查一个记录是否为&#34; value = 0&#34;也是过滤维度输出的一部分。在小提琴示例中,a可以检查与值= 0关联的键是否也出现在dimId.top(Infinity)的输出中。
问题是我无法在.colorCalculator()函数中执行此操作。在这个函数里面,我只能访问不是键的值...而且,遍历每个记录的所有维度值并不像一个智能解决方案(维度由数十万个元素组成。 。)
感谢您的帮助!
答案 0 :(得分:1)
执行此操作的最佳方法可能是使用自定义缩减功能来跟踪每个组的总和和计数。像:
var dimId = cf.dimension( function (d) { return d.id; } );
var groupId = dimId.group().reduce(
function(p,v) {
p.count = p.count + 1;
p.sum = p.sum + v.val;
return p;
}, function (p, v) {
p.count = p.count - 1;
p.sum = p.sum - v.val;
return p;
}, function () { return { count: 0, sum: 0 }; }
);
这里,当你执行groupId.top(10)时,你将获得一组数组,每个组的'value'将是一个具有'sum'和'count'属性的对象。您可以使用'count'属性来确定组中是否有任何记录,如果有,您可以从'sum'属性中读取值。