GUNMA GIS GEEK

群馬県の片隅でオープンデータとデータビジュアライゼーションとGIS(地理情報システム)に戯れるエンジニアのブログ

D3v3

【D3.js】超基本! コンソールでselect,data,enterメソッドを理解する。

投稿日:2013年3月12日

D3.jsの学習曲線が急激な坂道を描くのは、D3独特のデータバインディングの仕組みを理解するのに時間がかかるためだと思います。

そこで、ブラウザの開発ツールを使用してD3.jsの基本であるデータバインディングの仕組みを細かく観察していきます。
 
 

ちなみに下記の記事を参考にさせていただきました。合わせて読むと理解がしやすいかもしれません。

D3 Tutorials: Binding data


サンプル

今回使用するHTMLです。
D3.jsライブラリの読み込みと、バインドするデータとして変数aを設定しているだけのソースです。
bodyタグの中には、何のエレメントも存在しません。
ここに、開発ツールのコンソールからD3.jsを使用してデータ(変数a)をバインドしたp要素を追加します。

1.要素の選択

まずは、selectメソッドから。
jQueryのcssセレクタと殆どかわりません。
ここでは、bodyタグを選択しています。
戻り値としてD3 Selectionオブジェクトが返ってきます。

d3select000000

2.データをバインドする要素の選択

bodyタグの中の全てのpタグを選択しています。
ここで重要なのは、このステートメントが実行される段階では対象となるpタグはまだ存在していません
DOM上に存在していないエレメントを選択しているわけですが、エラーにはなりません。
これが、データをバインディングする要素を決定する宣言となります。
戻り値として空のD3 Selectionオブジェクト(配列)が返ります。
d3select000001

3.データのバインドを開始

dataメソッドでデータのバインドを開始します。
先ほどの空の配列にデータ分(length)の空オブジェクトが準備され、戻り値として返ります。

d3select000002

4.データの数だけ、d3オブジェクトを作成

enterメソッドでdataメソッドで準備された空のオブジェクトにデータを保存します。
戻り値の中を確認すると、それぞれのオブジェクトに__data__プロパティが追加され、そこにデータが保存されているのが見えます。

d3select000003

5.データをバインドし、要素を追加

appendメソッドでp要素とデータのバインディングを行います。
この時点で初めてDOMにPタグが挿入されます。

d3select000004

戻り値を見ると、各要素に__data__プロパティが挿入されているのが見えます。
d3select000005

6.バインドされたデータを使用して要素を操作

バインドされたデータを使ってpタグにテキストを挿入します。
textメソッドの中でコールバックを渡していますが、引数(d)には__data__プロパティの値が渡されます。
コールバック内のreturn で返した戻り値がテキストとしてpタグに挿入されます。

d3select000006

 

以上が、d3.jsのデータバインディングの基本的な仕組みとなります。
さらに詳しく知りたい方は、以下のドキュメントを参照してください。

d3.js – 三つの小円


実際に実行して試せるページを作ってみました。
ボタンを上から順にクリックしてconsole.logに出力された内容を確認してみてください。

d3select000007

example
※Mac版のchromeだとfirebug liteが何故か動作しなくて動かない orz
 
 

関連

既にDOM上に存在している要素に対してデータを元に操作する、新たなデータをバインドするなどについては下記の記事を参照ください。
【D3.js】データセットの増減をDOM要素に反映する

About Me

著者: 清水正行
所在地: 群馬県高崎市

群馬・東京間を行き来する出稼ぎエンジニア。GIS(地理情報システム)・データビジュアライゼーション・オープンデータなどについて書いてます。