2016-12-11 6 views
3

d3 v3で次のコードを使用して、水平のツリー(上から下)のノードとリンクを探しました。私はD3 v4の中で同じことをやろうとしているd3 v4でリンクを見つける方法は?

var nodes = d3.layout.tree().nodes(jsonData).reverse(); var links = d3.layout.tree().links(nodes);

Hereは、ツリーは次のようになります方法です。 v4にはノードを受け入れることができるtree.links(nodes)メソッドがありません。

どのようにしてd3 v4のリンクを見つけることができますか?

+0

'd3.tree'は、[API](https://github.com/d3/d3-hierarchy/blob/master/README.md#tree)バージョン4に変更され、一方は、そこではありませんメソッド間の1つの関係。私はあなたが[バージョン4の例](https://bl.ocks.org/d3noob/b024fcce8b4b9264011a1c3e7c7d70dc)から始めることをお勧めします。 – Mark

答えて

4

デモから回答を掘り起こす必要がないため、自分自身(そしておそらく他の人)の時間を節約するために、これを追加しています。私はD3も新しくなっているので、これは私にとってそうであったように他の人にも役に立つと思っています。

d3.hierarchy() & node.descendants()を使用してノードとリンクを取得します。

// Assigns parent, children, height, depth, etc.. 
var root = d3.hierarchy(jsonData); 

// Assigns the x and y coordinates for the nodes. 
tree(root); 

// Returns array of node objects. 
var nodes = root.descendants(); 

// Returns array of link objects between nodes. 
var links = root.descendants().slice(1); 
//var links = root.links(); // to get objects with source and target properties. 

上記をすべて実行したい場合は、これを少し短くすることもできます。

イベント内でノード/リンクを取得する必要がある場合。たとえば、ツリー図を使用しているときにノードのドラッグを開始する場合などです(これは他の場所でも便利です)。

var drag = d3.drag() 
    .on("start", function dragStart(d) { 
     var nodes = d.descendants(), 
      links = nodes.slice(1); 
    }); 

または代替的に、各リンクは、ソースおよびターゲットのプロパティを定義する場合node.links()を使用します。

var drag = d3.drag() 
    .on("start", function dragStart(d) { 
     var nodes = d.descendants(), 
      links = d.links(); 
    }); 

これはこの場合も機能すると思いますが、(バマー)ではありません。

var root = d3.hierarchy(jsonData), 
    nodes = tree(root).descendants(), 
    links = nodes.links(); // <-- only works on a single node, resort to slice(1). 
関連する問題