2012-01-24 11 views
7

私はD3.jsライブラリを使用して力有向グラフのデモで探しています:私はまた、ノードリンクツリーで探していますD3.js - 力の有向グラフとノードリンクツリーの間でアニメートすることはできますか?

http://mbostock.github.com/d3/ex/force.html

enter image description here

http://mbostock.github.com/d3/ex/tree.html

enter image description here

私がやりたい何

は次のとおりです。

- 力 - 有向グラフで起動し、ユーザーが ノード上でクリックしたとき、それは中央に選択したノード で、ツリーにスムーズにアニメーションしています。 - 次に、ユーザーがキャンバス内の空きスペースをクリックすると、 は強制的なグラフにアニメーション表示されます。

これまで誰もこのようなことをやったことがありますか?私はD3.jsが新しく、これがフレームワークでもサポートされているのかどうかはわかりません。

+0

私は、力の強いグラフをツリーに変更したくないことに気付きました。選択したノードが中央に配置され、その接続が周囲に配置されるようにノードの位置を変えたいのですが、それらの周りのそれらの接続、など。私がしたいと思うのは、ノードの座標とリンクの長さをすべて明示的に設定し、それらを固定しておくことです。 –

+0

私はここでの意図を理解しているかどうかはわかりません。あなたが階層構造を扱っていないときに、 "その接続がその周りに配置され、それらの周りにそれらの接続が"配置されていることは、強制的にレイアウトされたレイアウトとまったく同じです。私はクリックした後でもすべてのノードとリンクを表示する必要がありますか? – nrabinowitz

+0

おそらく、真ん中に固定の位置を持つ目に見えないノードを持つ可能性があります。ユーザがノードを選択するたびに、そのノード(目に見えない中間)と選択肢の間に(他の力よりもはるかに大きな力で)リンクを追加します。(ユーザーが新しいノードを選択するたびに、前のリンクを削除する必要があります) – alm

答えて

7

あなたがする必要があるのは、強制を停止し、既存のノードの変形を他のレイアウトから派生したx-yに適用することです。だからあなたの関数は次のようになります。

force.stop(); 
d3.selectAll("g.nodes").transtion().duration(500) 
    .attr("translate","transform("+newLayoutX+","+newLayoutY+")" 

その後、あなたのノードの配列を反復処理し、新しいXYを反映するためにxypxpy値を設定します。これにはない

https://gist.github.com/emeeks/4588962

:これは、あなたがforce.start()

を実行するときは、この例ではplotLayout()機能を見てみることができます力のレイアウトのための現在のxy位置を知るために、あなたのノードを設定しますしかし、2番目のd3.layoutに依存しています。問題は、ツリーレイアウトの階層データセットが必要なことです。階層レイアウトでは、ノードとエッジのデータをnode.childrenの配列に変換する必要があります。私が行う方法は、データセットを複製し、それを手動で平坦化することですが、私が気付いていないより洗練されたソリューションがあるかもしれません。

関連する問題