したがって、ツリー レイアウトの「サイズ」を設定するときは、ツリー レイアウトが x 値と y 値を補間する値を設定するだけです。したがって、必要な幅または高さを計算して、更新呼び出しごとにレイアウトで変更できない理由はありません。
あなたが与えた例をjsFiddleにコピーし、更新機能に以下を追加しました:
// compute the new height
var levelWidth = [1];
var childCount = function(level, n) {
if(n.children && n.children.length > 0) {
if(levelWidth.length <= level + 1) levelWidth.push(0);
levelWidth[level+1] += n.children.length;
n.children.forEach(function(d) {
childCount(level + 1, d);
});
}
};
childCount(0, root);
var newHeight = d3.max(levelWidth) * 20; // 20 pixels per line
tree = tree.size([newHeight, w]);
これはかなり大雑把な計算であり、子供が親に対してどこにいるかなどを考慮していないことに注意してください。ただし、アイデアはわかります。
ノードの x 値の操作に関しては、おそらく最も簡単なのは、レイアウトが完了した後でノードを変更することです。実際、y 座標を使用した例では、これが既に行われていることがわかります。
// Normalize for fixed-depth.
nodes.forEach(function(d) { d.y = d.depth * 180; });
彼はこれを行って、子が隠されている場合でも、ノードの特定のレベルが同じ y 位置にとどまるようにします。そうしないと、すべての子を折りたたむと、残りのレベルが伸びて幅全体を占めるようになります (その行をコメントアウトして、何が起こるかを確認してください)レベル全体を非表示に切り替えると)。
トップダウンについては、x と y (および x0 と y0) が表示されている場所ならどこでも反転できると思います。対角投影にも同じことを行って、線が反転することを忘れないでください。