在 dc.js 仪表板的一个交叉过滤器维度中使用多个字段

Using multiple fields in one crossfilter dimension for a dc.js dashboard

在我的数据集中,我有 4 列,格式如下:

data-example

基本上我们一直在跟踪患者,一旦事件发生,从那个时间段到结束的所有值都将是真实的。因此,要查看特定时间的生存百分比,我需要及时查看在那个时刻 'false' 有价值的人数 我试图将其放入折线图 (dc.js) 中,其中 x 轴表示时间,y 轴表示包含 'false'(当时)

的数据集的百分比

我首先尝试使用 4 个不同的维度来执行此操作,每个字段 1 个。这无法正常工作。

我假设我需要将这 4 个字段放入一个维度。

我有一个 printfilter 函数来检查我的维度和组是否正常工作:

function print_filter(filter){
        var f=eval(filter);
        if (typeof(f.length) != "undefined") {}else{}
        if (typeof(f.top) != "undefined") {f=f.top(Infinity);}else{}
        if (typeof(f.dimension) != "undefined") {f=f.dimension(function(d) { return "";}).top(Infinity);}else{}
        console.log(filter+"("+f.length+") = "+JSON.stringify(f).replace("[","[\n\t").replace(/}\,/g,"},\n\t").replace("]","\n]"));
    }; 

当我在 myDimension.group.reduceCount() 上调用此过滤器时,我希望输出如下所示:

[{0 : 100}, {13: 48}, {26 : 60}, {52: 72}] 

对象中的第一项是时间(以周为单位),第二项是当时有假的人的百分比

我应该如何设置维度和组来实现此输出?

更新: 尝试使用以下代码也不起作用:

var recDim = {
                            x0: cf1.dimension(function(d){return d.recidiefNa0;}),
                            x13: cf1.dimension(function(d){return d.recidiefNa13;}),
                            x26: cf1.dimension(function(d){return d.recidiefNa26;}),
                            x52: cf1.dimension(function(d){return d.recidiefNa52;})
                         };
            var recGroup =  {
                                0: recDim.x0.group(),
                                13: recDim.x13.group(),
                                26: recDim.x26.group(),
                                52: recDim.x52.group()
                            } ;

          print_filter(recGroup); 

更新 2: 我尝试改用 4 个维度并制作复合折线图。这是当前代码。它计算并在正确的位置呈现数据点,因为它的 4 个不同的图表确实显示了正确的线

var recDim0 = cf1.dimension(function(d){ return [d.recidiefNa0]});
            var recDim13 = cf1.dimension(function(d){return [d.recidiefNa13]});
            var recDim26 = cf1.dimension(function(d){return [d.recidiefNa26]});
            var recDim52 = cf1.dimension(function(d){return [d.recidiefNa52]});

            var recGroup0 = recDim0.group();
            var recGroup13 = recDim13.group();
            var recGroup26 = recDim26.group();
            var recGroup52 = recDim52.group();

            var scChart = dc.compositeChart("#scStepChart");
            scChart
            .width(600)
            .height(400)
            .x(d3.scale.linear().domain([0,52]))
            .y(d3.scale.linear().domain([0,100]))
            .clipPadding(10)
            .brushOn(false)
            .xAxisLabel("tijd in weken")
            .yAxisLabel("percentage vrij van residu/recidief")
            .compose([
                dc.lineChart(scChart)
                    .dimension(recDim0)
                    .group(recGroup0)
                    .renderDataPoints(true)
                    .renderTitle(false)
                    .keyAccessor(function(d) {return 0;})
                    .valueAccessor(function(d){return d.value/cf1.groupAll().reduceCount().value()*100;}),
                dc.lineChart(scChart)
                    .dimension(recDim13)
                    .group(recGroup13)
                    .renderDataPoints(true)
                    .renderTitle(false)
                    .colors(['blue'])
                    .keyAccessor(function(d){return 13;})
                    .valueAccessor(function(d){return d.value/cf1.groupAll().reduceCount().value()*100;}),
                dc.lineChart(scChart)
                    .dimension(recDim26)
                    .group(recGroup26)
                    .renderDataPoints(true)
                    .renderTitle(false)
                    .colors(['blue'])
                    .keyAccessor(function(d){return 26;})
                    .valueAccessor(function(d){return d.value/cf1.groupAll().reduceCount().value()*100;}),
                dc.lineChart(scChart)
                    .dimension(recDim52)
                    .group(recGroup52)
                    .renderDataPoints(true)
                    .renderTitle(false)
                    .colors(['blue'])
                    .keyAccessor(function(d){return 52;})
                    .valueAccessor(function(d){return d.value/cf1.groupAll().reduceCount().value()*100})


            ])                    
            .xAxis().ticks(4);
            scChart.render();

这是结果,您可以看到该行显示不正确。

http://postimg.org/image/gitdw1yj9/

评论中有JSFiddle和CodePen的链接

在@Gordon 的帮助下解决了这个问题。将我的数据格式改回一个字段:以周数作为值。

使用这个假组我能够得到正确的图表:

function accumulate_subtract_from_100_and_prepend_start_point_group(source_group) {
return {
    all:function () {
        var cumulate = 100;
        var result = [];
        return [{key: 0, value: cumulate}]
           .concat(source_group.all().map(function(d) {
              cumulate -= d.value;
              return {key:d.key, value:cumulate};
           }));
    }
};

}