2012-04-20 49 views
8

私はd3.js(およびSVG全体)の新機能を使用しています。d3のエルボーコネクターを使用したツリー/樹形図

私はここからD3の一例をcannibalisedている:http://mbostock.github.com/d3/ex/cluster.html と私はそれがよりここprotovisの例のようにしたい:

私はスタートをしましたここに:http://jsbin.com/ugacud/2/edit#javascript,htmlと私は間違っている次のスニペットだと思う:

var diagonal = d3.svg.diagonal() 
.projection(function(d) { return [d.y, d.x]; }); 

しかし、明白な交換はありません。d3.svg.lineを使用できますが、正しく統合する方法がわかりません。理想的には、私はエルボーコネクターが好きです...私が間違っている私が見てきた多くのd3の例は、重力を使って木の代わりにオブジェクトのグラフを描いているためです。

答えて

23

diagonal関数をSVGの "H"と "V"を使用してカスタムパスジェネレータに置き換えてくださいpath commands。ソースとターゲットの座標(X Y)が交換されていることを

function elbow(d, i) { 
    return "M" + d.source.y + "," + d.source.x 
     + "V" + d.target.x + "H" + d.target.y; 
} 

注意。この例では、水平方向のレイアウトを表示しますが、レイアウトは常に同じ座標系を使用します。xはツリーの幅です。yはツリーの深さです。したがって、右端にリーフ(一番下)のノードを持つツリーを表示する場合は、xyを入れ替える必要があります。これが対角の投影関数ですが、上記の肘の実装では、configurable functionを使用するのではなく、その動作をハードコーディングしただけです。

svg.selectAll("path.link") 
    .data(cluster.links(nodes)) 
    .enter().append("path") 
    .attr("class", "link") 
    .attr("d", elbow); 

と作業例:

と同様に

+0

おかげでマイク、私はあなたがこの質問を参照してくださいね期待していました!私はこれを行って、後で報告するつもりです....あなたが読むことをお勧めする良いSVGチュートリアルのサイトはありますか?...心に留めて、私は何も知らないのですか? –

+0

これは絶対に正しい答えでした。ありがとうございました –

+0

ちょっと@mbostock、私は今あなたの肘のコードを使用していますが、トグル(expand、collaspe)と組み合わせるともう機能しません(Diagonalはうまく機能します)。どのように私はそれを動作させることができます説明できますか? –

関連する問題