【问题标题】:Dynamically resize the d3 tree layout based on number of childnodes根据子节点的数量动态调整 d3 树布局的大小
【发布时间】:2012-10-27 20:09:38
【问题描述】:

从这个例子 http://mbostock.github.com/d3/talk/20111018/tree.html 我已经构建了一个d3 tree layout,其中根位于浏览器窗口的中间(root.x0 = width/2),节点位于向下方向而不是向右。

是否可以重新调整树的大小,使树的宽度取决于 在树的节点数上,如果节点数较少,则宽度较小 否则,如果节点数大于宽度,则宽度很大?

我还想知道d3 tree layout目前是如何计算“d.x”属性的?如何操纵“d.x”属性来调整间距 d3 树布局的节点之间。

【问题讨论】:

  • 你找到方法了吗?

标签: javascript layout d3.js tree


【解决方案1】:

因此,当您设置树布局的“大小”时,您所做的就是设置树布局将 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)的任何地方翻转。不要忘记对对角线投影做同样的事情,以确保你的线条也翻转。

【讨论】:

  • 它在 2018 年仍然像魅力一样工作,谢谢您,先生! :D
猜你喜欢
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 2023-02-04
  • 2012-05-31
  • 2011-11-20
相关资源
最近更新 更多