【发布时间】: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 正确:
- 有没有办法让交叉过滤器返回 undefined 或 null 或 除 0 以外的所有其他值?
- 或者有一种方法可以修改 colorCalculator 函数,以便能够检查一个值是否为 0,它是哪种 0?
[更新]
我试图检查“value = 0”的记录是否也是过滤维度输出的一部分。在小提琴示例中,a 可以检查与 value = 0 关联的键是否也存在于 dimId.top(Infinity) 的输出中。
问题是我不能在 .colorCalculator() 函数中这样做。在这个函数中,我只能访问值而不是键......此外,遍历每条记录的所有维度值看起来并不像一个聪明的解决方案(维度是由数十万个元素组成的......)
感谢您的帮助!
【问题讨论】:
标签: javascript d3.js dc.js crossfilter