これは、D3言語の宣言型の性質の一部です。ThinkingwithJoinsの記事で詳細に説明されています。抜粋:
しかし、selectAll( "circle")とは何ですか?新しい要素を作成するために、存在しない要素を選択する必要があるのはなぜですか?ワット。
これが取引です。D3に何かを行う方法を指示する代わりに、D3に必要なことを指示します。この場合、円の要素をデータに対応させる必要があります。データごとに1つの円が必要です。次に、D3に円を作成するように指示する代わりに、選択した「円」がデータに対応する必要があることをD3に伝え、そこに到達する方法を説明します。この概念は、データ結合と呼ばれます。
このベン図は、データ結合を示しています。既存の要素にバインドされたデータは、更新(内部)選択を生成します。バインドされていないデータは入力選択を生成し(左)、バインドされていない要素は終了選択を生成します(右)。データ入力更新要素終了結合を使用して考えると、シーケンスの背後にある謎が明らかになります。
selectAll( "circle")は、SVGコンテナ要素(svg)が空であるため、空の選択を返します。ここには魔法はありません。
空の選択はデータに結合されます:data(data)。dataメソッドは、データを要素にバインドし、入力、更新、終了の3つの仮想選択を生成します。入力選択には、欠落している要素のプレースホルダーが含まれています。更新の選択には、データにバインドされた既存の要素が含まれます。残りの要素はすべて、削除のために出口選択に含まれます。
選択範囲が空だったため、すべてのデータはenter()のプレースホルダーノードになります。
これは最初の例と同じ追加ですが、複数のプレースホルダーに適用されます。選択メソッドは、選択された要素を暗黙的に繰り返し処理します。欠落している要素は、append( "circle")によってSVGコンテナに追加されます。
以上です。選択した「円」をデータに対応させたいと考え、不足している要素を作成する方法を説明しました。