NVD3 - 向堆积面积图添加多条垂直线并调整其大小
NVD3 - Adding and resizing multiple vertical lines to stacked area chart
我正在尝试向堆积面积图中添加多条垂直线。
添加多行是使用 for 循环实现的(可能不是最好的方法)。问题是,用 nv.utils.windowResize()
更新行时 for-loop 似乎不起作用——最终只更新了最后一行。
也许这可以在不使用循环的情况下以更 D3 的方式完成? Here is a fiddle 重现问题(第 207 - 235 行)。
我会重新编写您的自定义行,使其本质上更 d3
-ish(使用数据绑定、无显式循环等...)
var xgrid = [1166996800000, 1186996800000, 1216996800000];
// add vertical lines
var custLine = d3.select('#stackedbarchart')
.select('.nv-areaWrap')
.append('g');
custLine.selectAll('line')
.data(xgrid)
.enter()
.append('line')
.attr({
x1: function(d){ return chart.xAxis.scale()(d) },
y1: function(d){ return chart.yAxis.scale()(0) },
x2: function(d){ return chart.xAxis.scale()(d) },
y2: function(d){ return chart.yAxis.scale()(1) }
})
.style("stroke", "#000000");
然后更新变成:
nv.utils.windowResize(function() {
chart.update();
custLine.selectAll('line')
.transition()
.attr({
x1: function(d){ return chart.xAxis.scale()(d) },
y1: function(d){ return chart.yAxis.scale()(0) },
x2: function(d){ return chart.xAxis.scale()(d) },
y2: function(d){ return chart.yAxis.scale()(1) }
});
});
注意其中使用了过渡,因此随着图表的重新绘制,线条移动得更好一些。
已更新 fiddle。
你真的不需要for循环来做这个,只需要使用selectAll
。这是一种方法:
首先,在第 210 行的 for 循环中,我很容易地为 select 垂直线分配了一个名为 vlines 的 ID
.attr('id', 'vlines')
然后使用 selectAll 和这个 id 来更新调整大小的行。这是更新后的调整大小函数:
nv.utils.windowResize(function() {
chart.update();
d3.selectAll('#vlines')
.attr('x1', function (d,i) { return chart.xAxis.scale()(xgrid[i]); })
.attr('y1', function (d,i) { return chart.yAxis.scale()(0); })
.attr('x2', function (d,i) { return chart.xAxis.scale()(xgrid[i]); })
.attr('y2', function (d,i) { return chart.yAxis.scale()(1); });
});
使用selectAll
和函数,在大多数情况下可以轻松避免循环。
我正在尝试向堆积面积图中添加多条垂直线。
添加多行是使用 for 循环实现的(可能不是最好的方法)。问题是,用 nv.utils.windowResize()
更新行时 for-loop 似乎不起作用——最终只更新了最后一行。
也许这可以在不使用循环的情况下以更 D3 的方式完成? Here is a fiddle 重现问题(第 207 - 235 行)。
我会重新编写您的自定义行,使其本质上更 d3
-ish(使用数据绑定、无显式循环等...)
var xgrid = [1166996800000, 1186996800000, 1216996800000];
// add vertical lines
var custLine = d3.select('#stackedbarchart')
.select('.nv-areaWrap')
.append('g');
custLine.selectAll('line')
.data(xgrid)
.enter()
.append('line')
.attr({
x1: function(d){ return chart.xAxis.scale()(d) },
y1: function(d){ return chart.yAxis.scale()(0) },
x2: function(d){ return chart.xAxis.scale()(d) },
y2: function(d){ return chart.yAxis.scale()(1) }
})
.style("stroke", "#000000");
然后更新变成:
nv.utils.windowResize(function() {
chart.update();
custLine.selectAll('line')
.transition()
.attr({
x1: function(d){ return chart.xAxis.scale()(d) },
y1: function(d){ return chart.yAxis.scale()(0) },
x2: function(d){ return chart.xAxis.scale()(d) },
y2: function(d){ return chart.yAxis.scale()(1) }
});
});
注意其中使用了过渡,因此随着图表的重新绘制,线条移动得更好一些。
已更新 fiddle。
你真的不需要for循环来做这个,只需要使用selectAll
。这是一种方法:
首先,在第 210 行的 for 循环中,我很容易地为 select 垂直线分配了一个名为 vlines 的 ID
.attr('id', 'vlines')
然后使用 selectAll 和这个 id 来更新调整大小的行。这是更新后的调整大小函数:
nv.utils.windowResize(function() {
chart.update();
d3.selectAll('#vlines')
.attr('x1', function (d,i) { return chart.xAxis.scale()(xgrid[i]); })
.attr('y1', function (d,i) { return chart.yAxis.scale()(0); })
.attr('x2', function (d,i) { return chart.xAxis.scale()(xgrid[i]); })
.attr('y2', function (d,i) { return chart.yAxis.scale()(1); });
});
使用selectAll
和函数,在大多数情况下可以轻松避免循环。