Javascript D3访问2d对象数组中的最大值-Y轴
我有一个D3堆积面积图,我试图在图中重新计算刷牙时的Y轴。问题是,当我重新计算Y轴的最大值时,它不是所有不同层的组合,它只是最后一层。例如,如果我刷了1/17和1/20日期,我将得到45作为最大Y轴值,而不是95(50+45)。以下是数据:Javascript D3访问2d对象数组中的最大值-Y轴,javascript,d3.js,Javascript,D3.js,我有一个D3堆积面积图,我试图在图中重新计算刷牙时的Y轴。问题是,当我重新计算Y轴的最大值时,它不是所有不同层的组合,它只是最后一层。例如,如果我刷了1/17和1/20日期,我将得到45作为最大Y轴值,而不是95(50+45)。以下是数据: [ { "key": "Failed", "vis": "1", "values": [ { "date": "2014-01-17T05:00:00.000Z",
[
{
"key": "Failed",
"vis": "1",
"values": [
{
"date": "2014-01-17T05:00:00.000Z",
"total": 50
},
{
"date": "2014-01-20T05:00:00.000Z",
"total": 23
}
]
},
{
"key": "Success",
"vis": "1",
"values": [
{
"date": "2014-01-17T05:00:00.000Z",
"total": 45
},
{
"date": "2014-01-20T05:00:00.000Z",
"total": 12
}
]
}
]
下面是我正在使用的一些示例代码。我知道外部循环的每次迭代都会抹去之前的循环,但我不确定如何着手修复它:
for (var i = 0; i < dataSeries.length; i++) {
if(dataSeries[i]['vis'] === "1") {
dataFiltered = dataSeries[i]['values'].filter(function(d) {
if((d.date >= main_x.domain()[0]) && (d.date <= main_x.domain()[1])) {
// this is just returning the biggest total in the date range from the last layer (i.e.: 'Failed'),
// not the greatest of all the layers for that day
return yValue(d);
}
});
}
}
for(var i=0;i 如果((d.date>=main_x.domain()[0])&(d.date在dataSeries
的每次迭代中,您都在执行dataFiltered
。在dataSeries
中,堆栈中的每个级别都有一个元素,因此这意味着dataFiltered
将只包含最后一个元素的值
但是,即使您解决了这个问题,您设置y刻度域的方式仍然有些奇怪:
main_y.domain([0, d3.sum(dataFiltered.map(function(d) { return d.total; }))]);
这是将域的上限值设置为拉丝范围内所有数据点的总和。您可能实际需要的是该范围内的最大完全堆叠高度
您可以这样做:
var dataFiltered = dataSeries.map(function(series) {
return series.values.filter(function(d) {
if((d.date >= main_x.domain()[0]) && (d.date <= main_x.domain()[1])) {
return yValue(d);
}
});
});
此时,dataStackSums
包含每个X轴值(日期)的属性,该值表示该堆栈的Y轴总和。从这里您只需确定最大堆栈:
var max = 0;
Object.keys(dataStackSums).forEach(function(key) {
max = Math.max(max, dataStackSums[key]);
});
然后您可以设置域:
main_y.domain([0, max]);
请注意,为了清晰起见,我将这些步骤分开,但为了提高效率,您可以将过滤和堆栈定向折叠为一个步骤。谢谢-这非常有效(我对文章进行了一次小编辑)。
main_y.domain([0, max]);