この記事で定義されているように、再利用可能なチャートは、任意の DOM 要素にチャートを挿入するdata
ために使用できます。さらに、ご指摘のとおり、DOM要素内に既に存在するグラフを更新するために使用できます。使用方法は次のとおりです(記事から):
var formatDate = d3.time.format("%b %Y");
var chart = timeSeriesChart()
.x(function(d) { return formatDate.parse(d.date); })
.y(function(d) { return +d.price; });
// Put the chart _inside_ #example1
d3.select("#example1")
.datum(data1)
.call(chart);
// Put the same chart _inside_ #example2
d3.select("#example2")
.datum(data1)
.call(chart);
// Update the data for #example1, without appending another <svg> element
setInterval(function () {
d3.select("#example1")
.datum(data2)
.call(chart);
}, 5000);
次に、それがどのように行われるかについての懸念に対処します。
まず、このコードは 内で実行されることに注意してくださいselection.each(...)
。API リファレンスによると、 .eachthis
内のコンテキストは DOM 要素です。API リファレンスはさらに次のように述べています。
each 演算子は、コールバック関数内で d3.select(this) を使用することにより、再帰的に選択を処理するために使用できます。
そのため、現在の DOM 要素のみを含む をd3.select(this)
返すだけで、その中に要素d3.selection
が含まれている場合と含まれていない場合があります<svg>
。ページ上のすべての<svg>
要素を選択すると、グラフを表示する DOM 要素だけでなくページ全体が混乱するため、あまり再利用可能なグラフにはなりません。
を使用すると、元のグループ化が維持されるのとselectAll
は対照的に、D3 が処理する要素の新しいグループ化が作成されます。ネストされた選択の仕組みの詳細については、select
この記事を参照してください。そして、はい、あなたの言うとおり、selectAll
ここのグループは 1 つの要素のみを作成または更新するために使用されます<svg>
。これにより、次のポイントに進みます。
D3 の背後にある基本的な概念の 1 つはdata-joinsです。これは、データの配列が DOM 要素のグループに1 対 1 で結合される方法です。この場合、いくつかを正確に 1 つの要素に追加/更新することに関心があります。Usingは、1 つの要素にバインドできる 1 つの要素の配列を提供します。または、これは次のように書くこともできます。data
<svg>
[data]
<svg>
var svg = d3.select(this).selectAll("svg").data([1]); // No `data`
// Update the area path.
g.select(".area")
.data(data) // Specifying data explicitly
.attr("d", area.y0(yScale.range()[0]));
// Update the line path.
g.select(".line")
.data(data) // Specifying data explicitly
.attr("d", line);
ただし、データを要素にバインドすることにより、サブセレクションでデータを既に使用できるようにしておくと、より便利です。<svg>