当前位置: 首页 > 知识库问答 >
问题:

根据子节点的数量动态调整d3树布局的大小

卫高明
2023-03-14

从http://mbostock.github.com/d3/talk/20111018/tree.html这个例子中,我构建了一个< code>d3树布局,其中根在浏览器窗口的中间(< code>root.x0 = width/2),节点在向下的方向,而不是面向右边。

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

我还需要知道d3树布局当前如何计算"d. x"属性?如何操作"d. x"属性来调整d3树布局节点之间的行间距。

共有1个答案

漆雕成弘
2023-03-14

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

 类似资料:
  • 对你来说有点困惑...... 我有一个730px宽,自动高度div。在这里面,我将小div的数量164px X 261px。 这些将被动态地拉入模板,所以我可以有1个,或者我可以有18个,或者为了这个练习,我可以有1000个,或者介于两者之间的任何地方。 我需要把它们隔开,这样每一行之间就有相等的距离。简单,如果我们处理多达4个,我可以这样做: 然而,当有人说5。我想要3个在最上面一排,2个在最下

  • 我使用一些JLabels和JTextFields作为JTree中的编辑器和渲染器。 用户可以点击任何JTextField并修改文本。一切正常。 我所缺少的是如何在用户键入时动态调整(增长)JTextField。 下面是一个说明问题的小示例程序。点击即“颜色”并输入一些额外的字符。JTextField保持其大小,这是预期的,但我希望它能增长和缩小以适应文本。 我尝试了不同的布局管理器,计算JText

  • 请看下面的P5代码 这个小应用程序的目的是在画布上拖放图像,根据“上传”图像的宽度和高度改变其大小。 使用:成功加载图像(至少显示图像)后,我将其宽度和高度分配给变量和。接着是画布大小的变化。。。这会导致一个错误,画布的大小与上传的图像相同(在上选中),但不显示任何内容。 使用:当禁用上的画布大小更改并单击画布时,调整大小会完美地显示图像。 应用程序需要在不点击的情况下工作,在删除图像后应该自动更

  • 我有一个Kafka主题,有50个分区 My Spring Boot应用程序使用Spring Kafka通过读取这些消息 Kubernetes中应用程序自动缩放的实例数。 默认情况下,Spring Kafka似乎每个主题启动1个消费者线程。 因此,对于应用程序的唯一实例,一个线程正在读取50个分区。 对于2个实例,有一个负载平衡,每个实例侦听25个分区。每个实例仍然有1个线程。 我知道我可以使用上的

  • 我正在通过为Ruby编写树库来研究树遍历算法。就基本建筑而言,似乎有两个合理的选择; 只有树。树有根值和子树 存在树和节点。一个节点有一个值,子节点。树有根节点和子树。子树的根节点是树的根节点的子节点 其中一种设计更常见吗?在这个库的开发过程中,1)太幼稚或2)不必要的冗余会变得“明显”吗?本图书馆的预期用途为一般用途;我希望它可以用于巨树、二进制搜索树或解析树等。 我能想到其他不那么合理的建筑;

  • 我正在寻找计算的最小和最大数量的节点和树叶在一个有根的树与高度h和度d。 我猜叶子的最小数量总是1(如果h 我是正确的还是我错过了什么?