javascript 如何动态指定d3树的高度和宽度,以允许它占用所需的所有空间[关闭]

blmhpbnm  于 2023-03-21  发布在  Java
关注(0)|答案(2)|浏览(161)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
昨天关门了。
Improve this question
d3 example
我按照链接中的例子。我想指定高度和宽度为“无限”,可以这么说,因为我的json文件真的很大,节点重叠,因为树和svg元素的高度和权重都是固定的。我怎么做?

kmbjn2e3

kmbjn2e31#

我的算法看起来像这样:
1.将树大小设置为已知的恒定大小。
1.从展开位置的所有子节点开始(即每个人都有.children而不是._children)。
1.调用tree.nodes(root)
1.递归访问每个叶节点并确定最大d.yd.x值。
1.然后,高度变为最大d.y乘以节点大小(圆半径)加上填充。
1.然后宽度变为最大d.x乘以节点大小(圆半径)加上填充。
1.设置新的树大小,新的SVG大小,重新调用tree.nodes(root)并绘制。

t3psigkw

t3psigkw2#

我也遇到了同样的问题。我所做的是根据孩子们进出的数量在click上更新tree.size([height,width])

// Toggle children on click.
function click(d) {
  if (d.children) {
    d._children = d.children;
    d.children = null;
  } else {
    d.children = d._children;
    d._children = null;
  }
  update(d);
}

变成

// Toggle children on click.
function click(d) {
    if (d.open) {
        if (d.children) {
            height = height - d.children.length * 20;
            d._children = d.children;
            d.children = null;
        } else {
            height = height - d._children.length * 20;
            d.children = d._children;
            d._children = null;
        }
    } else {
        if (d.children) {
            height = height + d.children.length * 20;
            d._children = d.children;
            d.children = null;
        } else {
            height = height + d._children.length * 20;
            d.children = d._children;
            d._children = null;
        }
    }
    d.open = !d.open;
    update(d);
}

}
我需要open属性是因为其他原因,所以也许你可以在没有这么多重复的情况下沿着。关键点是根据扩展或收缩的子元素的数量更新height全局变量。然后,在你的update函数中,你可以再次调用

tree = d3.tree().size([height, width]);

相关问题