javascript - 如何区分 "0"值和 dc.js geoChoroplethChart 中过滤掉的值?

标签 javascript d3.js dc.js crossfilter

我正在使用 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() 函数在 map 上正确呈现为 #666)
  • 如果过滤值中有 0 值,该值也会呈现为 #666!

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

[示例]
我做了一个 super 简单的jsfiddle来显示问题http://jsfiddle.net/danielepennati/77pqh/
数据集是这样的:

{id:"a1", tipo: "a", val: 0},
{id:"a2", tipo: "a", val: 1},
{id:"a3", tipo: "a", val: 2},
...

有 2 个维度(一个按 id,一个按 tipo)和 id 维度上的 1 个组。
首先,我只打印 id 组的输出。
如果您单击按钮,则在按“tipo”=“a”过滤到 tipo 维度后,您将获得相同 id 组的输出。
正如您在 fiddle 中看到的带有 "id"= "a1" 的记录,它是过滤维度的一部分,因为它具有 "tipo"= "a",与不属于过滤维度的其他记录(b1、b2、b3、...、c4、c5)具有相同的 0 值(因为它是它自己的值)

通过单击仪表板中的其他图表之一添加过滤器后,这与 dc.geoChoroplethChart() 中的输出类型相同,并且无法处理值 = 0 正确地:

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

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

感谢您的帮助!

最佳答案

做到这一点的最佳方法可能是使用自定义的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) 时,您将获得一个组数组,每个组的“值”将是一个具有“sum”和“count”属性的对象。您可以使用“count”属性来确定组中当前是否有任何记录,如果有,您可以从“sum”属性中读取值。

关于javascript - 如何区分 "0"值和 dc.js geoChoroplethChart 中过滤掉的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23722751/

相关文章:

javascript - 如何在 JavaScript 中突出显示搜索结果中匹配的子字符串

javascript - 如何根据另一个数组的内容对数组进行排序

javascript - 如何在 d3.js 中更新图表图例?

dc.js - 如何精确筛选日期?

javascript - D3.js 获取面积图最近的 X 和 Y 坐标

javascript - 有什么优雅的方法可以阻止用户创建本地副本吗?

php - 如何将此 PHP 正则表达式转换为 Javascript?

javascript - 奇怪的网格线行为

javascript - 使用 d3(v3 或 v4)读取 CSV,保存数据并回调

javascript - dc.js - 使用 jquery 数据表插件的数据表