首页 文章

如何区分dc.js geoChoroplethChart中的“0”值和滤出值?

提问于
浏览
0

我'm making some dashboard using crossfilter.js, d3.js and dc.js but I' m当数据集的值为"0"时出现问题
在仪表板中有一个dc.geoChoroplethChart(),我使用.colorCalculator()来区分过滤后的值:如果定义了d而不是0使用颜色,否则使用#666

.colorCalculator(function (d) { 
  return d ? map.colors()(d) : '#666';
})

问题是:

  • crossfilter为不遵循过滤器的值返回0(并且这些值在.colorCalculator()函数的 Map 上正确呈现为#666)

  • 如果我在过滤值中有0值,那么它也会呈现为#666!

我无法区分值是否为0,因为它必须为0或因为它不尊重过滤器!

[Example]
我做了一个超级简单的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维度有2个维度(一个是id,一个是tip),另一个是1维 .
首先,我只打印id组的输出 .
如果单击该按钮,则在通过"tipo" = "a"过滤到tipo维度后,将获得相同id组的输出 .
你可以在小提琴中看到"id" = "a1"的记录,它是过滤维度的一部分,因为它有"tipo" = "a",具有相同的0值(因为它是它自己的值)作为不属于其他记录的另一个记录过滤尺寸(b1,b2,b3,...,c4,c5)

这是我在dc.geoChoroplethChart()中输出的相同类型的输出,我通过单击仪表板中的另一个图表添加过滤器并且无法正确处理值= 0:

  • 有没有办法让crossfilter返回undefined或null或其他所有但不是0?

  • 或者有一种方法可以修改colorCalculator函数,以便能够检查值是否为0是哪种类型的0?

[UPDATE]
我试图检查带有"value = 0"的记录是否也是过滤维度输出的一部分 . 在小提琴示例中,a可以检查与值= 0相关联的键是否也存在于dimId.top(Infinity)的输出中 .
问题是我可以看起来像一个聪明的解决方案(维度是由数十万元素......)

谢谢你的帮助!

1 回答

  • 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'属性中读取值 .

相关问题