Javascript d3.js图形上的节点对齐

Javascript d3.js图形上的节点对齐,javascript,d3.js,tree,Javascript,D3.js,Tree,请看。然后单击查询。请注意,子项如何开始显示在与query相同的级别上。现在向下平移到方法(查询)的子项)并单击此项展开它。请注意method的子项是如何以不同的方式展开的,几乎是从中心展开的。这似乎是没有孩子时的行为 如何使这些子项以与query的子项相同的方式展开 我很确定问题出在下面的代码中(我想),但我仍然找不到罪魁祸首。我只是看不出最后一组孩子会有什么不同 var nodes=tree.nodes(root.reverse(), 链接=树。链接(节点); forEach(函数(d){/

请看。然后单击
查询
。请注意,子项如何开始显示在与
query
相同的级别上。现在向下平移到
方法
查询
)的子项)并单击此项展开它。请注意
method
的子项是如何以不同的方式展开的,几乎是从中心展开的。这似乎是没有孩子时的行为

如何使这些子项以与
query
的子项相同的方式展开

我很确定问题出在下面的代码中(我想),但我仍然找不到罪魁祸首。我只是看不出最后一组孩子会有什么不同

var nodes=tree.nodes(root.reverse(),
链接=树。链接(节点);
forEach(函数(d){//遍历节点
if(d.parent){//如果节点有父节点
对于(var i=0;i
在每个新级别的节点上,计算当前节点相对于父节点的y偏移量以及父节点相对于祖辈节点的y偏移量。但是,您不需要考虑从图形顶部(或第一个节点)开始的总yoffset

按如下方式进行Y偏移:

var nodes = tree.nodes(root).reverse(),
links = tree.links(nodes);

nodes.forEach(function(d) { //iterate through the nodes
  if(d.parent){ //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.yOffset = i; //index is how far node must be moved down
        d.parentYoffset = d.parent.yOffset; //must also account for parent downset

        if (d.parent.parentYoffset) {
            d.parentYoffset += d.parent.parentYoffset;
        }
      }
    }
  }
  if(d.yOffset === undefined){ d.yOffset = 0; }
  if(d.parentYoffset === undefined){ d.parentYoffset = 0; }
  d.x = (d.yOffset * 40) + (d.parentYoffset * 40) + 20;
  d.y = d.depth * 200;
}); 
var nodes=tree.nodes(root.reverse(),
链接=树。链接(节点);
forEach(函数(d){//遍历节点
if(d.parent){//如果节点有父节点
对于(var i=0;i