2016-05-02 33 views

回答

0

我重新編寫自定義線在本質上多一點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

+0

- 非常感謝!額外的過渡效果看起來不錯! :) –

0

你不需要一個for-loop來做到這一點,只需使用selectAll即可。這裏有一種方法:

首先,可以輕鬆地選擇垂直線給我分配他們的ID叫vlines,在for循環上線210

.attr('id', 'vlines') 

然後使用全選這個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和功能,你可以很容易地避免在大多數情況下循環。

+0

它的作品,謝謝! 'selectAll'真的很有用,猜想我必須學習更多關於D3基礎知識...... –

相關問題