2012-07-17 10 views
7

例:http://mbostock.github.com/d3/ex/bubble.htmlD3バブルの例:bubble.nodes()は何をしますか?

enter image description here

私は16行で何が起こっ理解に苦労しています:変数、

.data(bubble.nodes(classes(json)) 

そして、なぜ、またはクラス内の()関数classes []は、それぞれのオブジェクトに対して定義されたx、y、r値を取得します。また、bubble.nodes()は実際の関数ではないようですか?

Iはライン44と45との間

console.log(classes) 

を追加する場合 - すべてのオブジェクトが内部既にX、Y、Rで占めているように見える - しかし、これが起こる理由は明らかではありません。

+0

[[pack.nodesのAPIリファレンス]](https://github.com/mbostock/d3/wiki/Pack-Layout#wiki-nodes)を見ましたか? – mbostock

+0

はい - しました。関数内の 'classes'がbubble.nodesに基づいている前に割り当てられている追加のプロパティを持っている理由は説明しません。 ドキュメントには 'r'属性についての説明もありません。 – kratsg

+0

'r'プロパティは、レイアウトによって計算されるノード半径です。 – mbostock

答えて

1

classes()関数は属性を追加しません。ツリーを平坦化します。属性は、()d3.layout.pack(ある。ノードは、()))(bubble.nodes内部に追加され

JSON.stringify(classes[0]) 
"{"packageName":"cluster","className":"AgglomerativeCluster","value":3938}" 
2

bubble.nodes()の呼び出しがbubble=d3.layout.pack()のでd3.layout.pack().nodes()への呼び出しに帰着します。この場合、pack.nodes()は入力のchildren(この場合はすべてのパッケージ)のvalueキーを使用してノードのサイズを設定し、位置を決定するようにハードコードされています(xyを追加します)。本質的には

var root = {"children": [ 
       {"packageName":"cluster","className":"AgglomerativeCluster","value":3938}, 
       {"packageName":"cluster","className":"CommunityStructure","value":3812}, 
       {"packageName":"cluster","className":"HierarchicalCluster","value":6714}, 
       {"packageName":"cluster","className":"MergeEdge","value":743} 
     ]}; // This is an excerpt of the real data. 

var bubble = d3.layout.pack(); 

// pack.nodes() assigns each element of "children" a r, x, and y based on value 
bubble.nodes(root); 

は、これはあなたがclasses(root)は、それらの属性を持っていないので、classes()rx、およびyを追加していないことを確認することができ、同様に最初に私を倒してしまいました。 krasnayaの答えはこれのほとんどに触れましたが、私はもう少し説明が必要だと感じました(少なくとも私のためにしました)。

関連する問題