dc.js rowChart 按最大键过滤

dc.js rowChart to Filter by max key

我有一个仪表板,其中显示随时间变化的人数。一个是显示随时间变化的人数的折线图,另一个是按 HCLevel1 拆分的行图 - 仅供用户过滤。

我希望 rowChart 在日期过滤器中显示最新时期的头像(而不是显示整个时期的头像总数,这是错误的)。

我可以通过将两个字段组合成一个维度来做到这一点,但问题是当我使用 rowChart 按业务过滤时,我在折线图中只看到一个月 - 而我想查看过滤后的完整期间。我无法弄清楚如何使用假组执行此操作,因为 rowChart 的 dimension/key 是 HCLevel1.

我的数据格式如下:

var data =  = [
{
  "HCLevel1": "Commercial",
  "HCLevel2": "Portfolio TH",
  "Period": 201407,
  "Heads": 720
},

我已经尝试使用此自定义归约(从另一个 SO 问题中获取)但它无法正常工作(负值、不正确的值等)。

function reduceAddAvgPeriods(p, v) {
    if (v.Period in p.periodsArray) {
        p.periodsArray[v.Period] += v.Heads;
    } else {
        p.periodsArray[v.Period] = 0;
        p.periodCount++;
    }
    p.heads += v.Heads;
    return p;
}

目前,我的 jsfiddle 示例正在为维度组合 2 个字段,但如您所见,我无法使用 rowChart 进行过滤以在折线图上显示完整周期。

我可以使用 reductio 得到平均值,但我想提供最近过滤日期的实际 Heads 值。

https://jsfiddle.net/kevinelphick/4ybekqey/3/

我希望这是可能的,任何帮助将不胜感激,谢谢!

我几天前看过这个,但我花了一点时间才弄明白。棘手!

我们可以通过考虑这两个事实来限制设计:

  1. 我们想按"Level"筛选行图。简直了

    var dimLevel = cf.dimension(function (d) { return d.HCLevel1 || ''; });
    
  2. A group does not observe its own dimension's filters. 所以我们可能想使用#1 中的维度来为行图生成数据(组)。

考虑到这两个限制,也许我们可以按级别进行维度和分组,但在组的 bin 内,跟踪对该 bin 有贡献的时间段?

这是常用于stacked charts的常见模式:

var levelPeriodGroup = dimLevel.group().reduce(
    function(p, v) {
        p[v.Period] = (p[v.Period] || 0) + v.Heads;
        return p;
    },
    function(p, v) {
        p[v.Period] -= v.Heads;
        return p;
    },
    function() {
        return {};
    }
);

在这里,我们只 'peel off' 顶部堆栈,删除任何零:

function last_period(group, maxPeriod) {
    return {
        all: function() {
            var max = maxPeriod();
            return group.all().map(function(kv) {
                return {key: kv.key, value: kv.value[max]};
            }).filter(function(kv) {
                return kv.value > 0;
            });
        }
    };
}

为了使 last_period 更通用,maxPeriod 现在是一个函数,我们将这样定义它:

function max_period() {
    return dimPeriod.top(1)[0].Period;
}

将它们放在一起并提供给行图:

rowChart
    .group(last_period(levelPeriodGroup, max_period))
    .dimension(dimLevel)
    .elasticX(true);

由于句点不再是图表标签的一部分,我们可以将其放在标题中:

<h4>Last Period: <span id="last-period"></span></h4>

并在绘制折线图时更新它:

rowChart.on('pretransition', function(chart) {
    d3.select('#last-period').text(max_period());
});