で x 値を変更することにより、その効果を実現できます。
nodes.forEach(function(d) { d.x = /*yourValues*/; d.y = d.depth * 180; });
おそらく多くのことを認識していたように、特定の問題の真の鍵は、各ノードにそのレベルのノード数 (つまり兄弟) に関連する値を提供することです。提供した例ではすでにdepth
各ノードに値が与えられているため、常にノードを反復処理してそれらの値を集計し、最終的に次のような配列を生成できます。
node0 has 0 nodes before it in the same depth (depth 0)
node1 has 0 nodes before it in the same depth (depth 1)
node2 has 1 nodes before it in the same depth (depth 1)
更新forEach
上記のコードを次のコードに置き換えることで、兄弟の値を見つけて目的の効果を得ることができます。
nodes.forEach(function(d) { //iterate through the nodes
if(d.parent != null){ //if the node has a parent
for(var i = 0; i < d.parent.children.length; i++){ //check parent children
if(d.parent.children[i].name == d.name){ //find current node
d.downset = i; //index is how far node must be moved down
}
}
d.parentDownset = d.parent.downset; //must also account for parent downset
}
if(d.downset == null){ d.downset = 0; }
if(d.parentDownset == null){ d.parentDownset = 0; }
d.x = (d.downset * 40) + (d.parentDownset * 40) + 20;
d.y = d.depth * 180;
});
さらに、あなたの例で子供が命名されている方法では、.
から を1
取り出し、それ以外の場合はと をChild 1.1
返す0
Child 1
Child 2
nodes.forEach(function(d,i) {
d.x = d.numberAfterPeriod * 40 + 20;
d.y = d.depth * 180;
});