Javascript 使用D3.JS在同一级别上显示所有叶
我最近开始使用D3.js,以便以放射状树的形式可视化树,如中所示,但在修改代码时遇到了一些问题 我使用中的代码来显示相同“级别”上的所有叶。我的方法如下: 首先,使用以下代码计算树的最大深度,以知道树的所有叶子放在何处:Javascript 使用D3.JS在同一级别上显示所有叶,javascript,d3.js,tree,Javascript,D3.js,Tree,我最近开始使用D3.js,以便以放射状树的形式可视化树,如中所示,但在修改代码时遇到了一些问题 我使用中的代码来显示相同“级别”上的所有叶。我的方法如下: 首先,使用以下代码计算树的最大深度,以知道树的所有叶子放在何处: var maxDepth = getDepth(source); function getDepth(obj) { var depth = 0; if (obj.children) { obj.children.forEach(function (d) {
var maxDepth = getDepth(source);
function getDepth(obj) {
var depth = 0;
if (obj.children) {
obj.children.forEach(function (d) {
var tmpDepth = getDepth(d)
if (tmpDepth > depth) {
depth = tmpDepth
}
})
}
return 1 + depth}
然后,在树的所有节点上循环,每当遇到没有子节点(=叶)的节点时,位置设置为:
nodes.forEach(function(d) {
if (d.children)
{
d.y = d.depth * 60;
}else
d.y = maxDepth * 60;})
它似乎工作正常,只是有些节点的位置不正确,有时重叠
如何调整代码以更有效的方式传播节点?完整的代码可用。使用d3的集群布局,它的设计目的是将叶子放置在同一水平面上
可能只是使用默认的深度,因为数据集是一棵树(有子树),所以这种方法无法获得正确的位置。我建议将数据展平并将其传递给d3.agani
var tree = d3.layout.cluster()
.size([360, diameter / 2 - 80])
.separation(function(a, b) { return (a.parent == b.parent ? 1 : 5) / a.depth; });
...
// Normalize for fixed-depth.
//nodes.forEach(function(d) { d.y = d.depth * 80; }); // get rid of this line (or amend it) as it resets the leaves to one level below the parent