【问题标题】:How to distinguish "0" values from filtered out values in a dc.js geoChoroplethChart?如何区分“0”值和 dc.js geoChoroplethChart 中过滤掉的值?
【发布时间】:2014-05-18 14:02:46
【问题描述】:

我正在使用 crossfilter.js、d3.js 和 dc.js 制作一些仪表板,但是当数据集的值为 "0"
在仪表板中有一个 dc.geoChoroplethChart(),我使用 .colorCalculator() 来区分过滤后的值:如果定义了 d 但不是 0,则使用颜色,否则使用 #666

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

问题是:

  • crossfilter 返回 0 用于不考虑过滤器的值(这些值通过 .colorCalculator() 函数在地图上正确呈现为 #666)
  • 如果我在过滤值中有 0 值,这也会呈现为 #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 维度上有 2 个维度(一个按 id,一个按 Tipo)和 1 个组。
首先,我只打印 id 组的输出。
如果您单击按钮,则在按 "tipo" = "a" 过滤到tipo维度后,您将获得相同 id 组的输出。
正如您在小提琴中看到的那样,带有 "id" = "a1" 的记录,这是过滤维度的一部分,因为它具有 "tipo" = "a",与不属于过滤维度(b1、b2、b3、...、c4、c5)的其他记录具有相同的 0 值(因为它是它自己的值)

这是我在 dc.geoChoroplethChart() 中通过单击仪表板中的其他图表之一添加过滤器并且无法处理值 = 0 正确:

  • 有没有办法让交叉过滤器返回 undefinednull除 0 以外的所有其他值
  • 或者有一种方法可以修改 colorCalculator 函数,以便能够检查一个值是否为 0,它是哪种 0?

[更新]
我试图检查“value = 0”的记录是否也是过滤维度输出的一部分。在小提琴示例中,a 可以检查与 value = 0 关联的键是否也存在于 dimId.top(Infinity) 的输出中。
问题是我不能在 .colorCalculator() 函数中这样做。在这个函数中,我只能访问值而不是键......此外,遍历每条记录的所有维度值看起来并不像一个聪明的解决方案(维度是由数十万个元素组成的......)

感谢您的帮助!

【问题讨论】:

    标签: javascript d3.js dc.js crossfilter


    【解决方案1】:

    最好的方法可能是使用自定义 reduce 函数来跟踪每个组的总和和计数。喜欢:

    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.t​​op(10) 时,您将获得一组组,每个组的“值”将是一个具有“总和”和“计数”属性的对象。您可以使用 'count' 属性来确定组中当前是否有任何记录,如果有,您可以从 'sum' 属性中读取值。

    【讨论】:

    • 亲爱的 Ethan,第一次来意大利,您将赢得比萨!您的代码效果很好。我只需要更改 .colorCalculator() 函数来检查 if(d && d.count) 非常感谢。丹尼尔
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 2021-12-05
    相关资源
    最近更新 更多