我寫了一個可重用的d3折線圖(代碼如下)。不幸的是,只有當傳遞給它的數據數據更新時它才能正確更新;如果它傳遞了一個新的數據數組,它根本不會更新 - 您可以在jsfiddle中看到它。d3線和麪積圖不用新的數據陣列更新
下面是HTML,其中大部分是嵌入式演示調用腳本:
<style>
path { stroke: purple; stroke-width: 2px; fill: none; }
</style>
<body>
<div id="demo"></div>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="demoChart.js"></script>
<script>
var chart = demoChart();
var pts = [[[0,0],[200,0.25],[500,1]]];
d3.select("#demo").datum(pts).call(chart);
setTimeout(function() {
console.log("Modifying data array");
pts[0][2][1] = 0.5;
d3.select("#demo").datum(pts).call(chart);
},1000);
setTimeout(function() {
console.log("Passing new data array");
d3.select("#demo").datum([[[0,1],[200,0.45],[500,0]]]).call(chart);
},2000);
</script>
你可以看到它調用chart
第二次直接更新單個點的數據陣列中(pts[0][3][1] = 0.5
),以及圖表正確動畫。第三次它傳遞一個新的數據數組,並且圖表不會改變。
這裏是demoChart.js
代碼(基於reusable charts模式):
function demoChart() {
function xs(d) { return xScale(d[0]) }
function ys(d) { return yScale(d[1]) }
var xScale = d3.scale.linear().domain([0, 500]).range([0, 400]),
yScale = d3.scale.linear().domain([0, 1]).range([400, 0]),
line = d3.svg.line().x(xs).y(ys);
function chart(selection) {
selection.each(function(data) {
console.log("passed data: ", data);
// Select the svg element, if it exists; otherwise create it
var svg = d3.select(this).selectAll("svg").data([1]);
var svgGEnter = svg.enter().append("svg").append("g");
// Select/create/remove plots for each y, with the data
var plots = svg.select("g").selectAll(".plot").data(data);
plots.exit().remove();
var plotsEnter = plots.enter().append("g").attr("class","plot");
plotsEnter.append("path");
// Update the line paths
plots.selectAll("path")
.transition()
.attr("d", function(d,i) {
console.log("transitioning line with data: ", d);
return line.apply(this, arguments);
});
svg.attr("width", 400).attr("height", 400);
});
}
return chart;
}
我懷疑我失去了一些東西根本如何D3的作品。
如何在新數據數組通過時正確更新圖表?
就是這樣!謝謝你,感謝這個工作例子和mbostock解釋的鏈接。我還沒有弄清楚如何在'select'和'selectAll'之間進行選擇,但是從現在開始我會留意它... – 2015-01-21 23:24:56