使用crossfilter / dc.js绘制区域标准化条形图的高效方法?

我正在寻找在dc.js的多维数据集中绘制几个与连续变量相关的直方图。 虽然使用dc.barChart组件很容易实现,但我希望将这些直方图进行面积归一化。 在我的情况下,箱宽是统一的,所以这减少了将每个箱/组中的总计数除以(binWidth * totCounts)

我能够绘制这些直方图的初始视图,这些直方图使用以下几行代码进行区域归一化:

var cf = crossfilter(data);
var totCounts = cf.groupAll().value();
var histDimension = cf.dimension(function(d) {
  return Math.floor(d.fieldOfInterest / binWidth) * binWidth;
});
var histGroup = histDimension.group().reduceSum(function(d) {
  return 1 / (binWidth * totCounts);
});

将这种方法与dc.js结合确实会产生区域规格化的条形图。 但是,当我开始过滤数据时,过滤的数据不会重新标准化。 相反,视图始终通过未过滤数据集上原始区域归一化的透镜来呈现数据。

虽然我明白为什么会出现这种情况 - 交叉过滤器中的还原器功能仍在使用最初的标准化...我真的不明白是否有任何合理且高效的方法来实现我所寻找的...即对于过滤的数据集,dc.js绘图视图总是被重新归一化。 在我看来,由于任何单个桶/组的归一化都需要来自所有组(totCounts)的信息,因此没有增量/性能的方法来定义有效交叉过滤的减少功能。

我是否错过了一些显而易见的方法来实现我期望做的或者我应该放弃在crossfilter / dc.js中实现的希望? 我会很感激任何可能将我指向正确方向的投入。


我们需要做的是在减少计算中使用totCounts ,以便它能够适应不断变化的总量。 由于交叉过滤器逐渐计算减少量,因此它无法在总量发生变化时重新应用总量。

幸运的是,条形图的valueAccessor是完美的。 事实上,对于任何涉及划分的缩减来说,几乎总是一个更好的选择,因为在进行聚合和缩减(多次)时读取值(一次)和读取值时进行划分更有效。

在这里,我们只需要一种动态计算总数的方法,这就是groupAll的。 在这种情况下,我们可能需要dimension.groupAll(),因为它不会观察当前维度的过滤器。 我们不希望在当前图表上进行过滤,导致它不能汇总为一个。

把它们放在一起:

var cf = crossfilter(data);
var histDimension = cf.dimension(function(d) {
  return Math.floor(d.fieldOfInterest / binWidth) * binWidth;
});
var totCounter = histDimension.groupAll();
var histGroup = histDimension.group(); // default reduceCount

barChart
    .valueAccessor(function(kv) {
        var total = totCounter.value();
        return total && (kv.value / (binWidth * total));
    })
链接地址: http://www.djcxy.com/p/32721.html

上一篇: Efficient way to plot area normalized bar chart using crossfilter / dc.js?

下一篇: Interactive Charts (by dc.js) not updating each other correctly