Javascript 在dc.js仪表板的一个交叉过滤器维度中使用多个字段
在我的数据集中有4列,其格式如下: 基本上,我们全程跟踪患者,一旦事件发生,从该时间段到结束的所有值都将为真。所以要想知道某一时刻的存活率,我需要知道那个时刻有多少人的价值为“假” 我试图将其放入一个折线图(dc.js),其中x-as表示时间,y轴表示包含“false”的数据集的百分比(当时) 我首先尝试用4个不同的维度来做这件事,每个字段1个维度。这不正确 我假设我需要将这4个字段转换成一维 我有一个printfilter功能来检查我的维度和组是否正常工作:Javascript 在dc.js仪表板的一个交叉过滤器维度中使用多个字段,javascript,d3.js,data-visualization,dc.js,crossfilter,Javascript,D3.js,Data Visualization,Dc.js,Crossfilter,在我的数据集中有4列,其格式如下: 基本上,我们全程跟踪患者,一旦事件发生,从该时间段到结束的所有值都将为真。所以要想知道某一时刻的存活率,我需要知道那个时刻有多少人的价值为“假” 我试图将其放入一个折线图(dc.js),其中x-as表示时间,y轴表示包含“false”的数据集的百分比(当时) 我首先尝试用4个不同的维度来做这件事,每个字段1个维度。这不正确 我假设我需要将这4个字段转换成一维 我有一个printfilter功能来检查我的维度和组是否正常工作: function print_f
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();
这就是结果,因为您可以看到该行没有正确显示
评论中有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};
}));
}
};
}请分享您的尝试,或者(更好)使用Codepen、JSFIDLE或类似服务创建一个工作示例。一般来说,我会从重新构造数据开始,这样您就可以将所有观察结果排成行。对于这个数据集,只有一个实变量,因此它应该只有一列。当前数据集中的每一行在新数据集中应变成4行。通过一个工作示例,我们可以从那里开始工作。Hi there@EthanJewett,起初我在列中有数据,它是xAfter,值是发生后的周数。然而,这导致了一个问题,即我没有图表所需的0值(希望有意义)。另一个问题是,它将显示我所需要的有希望的百分比,即48而不是52。这无法通过从100中减去它来解决。以下是JSFIDLE:代码包含整个仪表板,但问题部分标记在包含“问题开始”和“问题结束”的注释之间。您需要每周显示一行,以及每个患者。N名患者和5个观察周(0、13、26、39、52)意味着您应该有N*5行。但是,数据集是一个csv文件,因此它不会在JSFIDLE上运行