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

D3 树垂直分离

仲孙兴平
2023-03-14

我使用的是D3树布局,例如:http://mbostock.github.com/d3/talk/20111018/tree.html

我已经根据我的需求对其进行了修改,并且遇到了一个问题。该示例也存在相同的问题,如果您打开了太多节点,那么它们就会变得紧凑,并使读取和交互变得困难。我想在重新调整舞台尺寸时定义节点之间的最小垂直空间,以允许这样的间距。

我尝试修改分离算法使其工作:

.separation(function (a, b) {
    return (a.parent == b.parent ? 1 : 2) / a.depth;
})

这不起作用。我还尝试计算哪个深度有最多的孩子,然后告诉舞台的高度是儿童*空间之间的节点。这让我更接近了,但仍然不准确。

depthCounts = [];
nodes.forEach(function(d, i) { 
    d.y = d.depth * 180;

    if(!depthCounts[d.depth])
        depthCounts[d.depth] = 0;

    if(d.children)
    {
        depthCounts[d.depth] += d.children.length;
    }
});

tree_resize(largest_depth(depthCounts) * spaceBetweenNodes);

我还尝试在下面的方法中更改节点的x值,它计算y分隔,但没有雪茄。我也会发布该更改,但我将其从我的代码中删除。

nodes.forEach(function(d, i) { 
    d.y = d.depth * 180;
});

如果您可以建议一种方法或知道一种方法,我可以在节点之间垂直完成最小间距,请发布。我将不胜感激。我可能错过了一些非常简单的东西。

共有3个答案

苏淇
2023-03-14

我知道我不应该回应其他答案,但我没有足够的声誉来添加评论。

不管怎样,我只是想为使用最新d3.v3.js文件的人更新这个。(我假设这是因为新版本,因为接受答案中的行引用对我来说是错误的。)

d3.布局。您正在编辑的树函数位于第6236行和第6345行之间。d3_layout_treeVisitAfter从第6318行开始。层次结构变量在第6237行声明。关于树的位。elementsize仍然有效-我把它放在第6343行。

最后(我假设这是一个错误):当您创建树时,将尺寸放在方括号内,就像您通常使用“size”一样。所以:

var tree = d3.layout.tree()
         .size(null)
         .elementsize([50, 240]);
班展
2023-03-14

我在谷歌群组用户的帮助下解决了这个问题。我找不到帖子。解决方案要求你在一个地方修改D3.js,这是不推荐的,但这是我唯一能找到的解决这个问题的方法。

从第< code>5724行或该方法开始:< code > D3 _ layout _ treeVisitAfter

改变:

d3_layout_treeVisitAfter(root, function(node) {
    node.x = (node.x - x0) / (x1 - x0) * size[0];
    node.y = node.depth / y1 * size[1];
    delete node._tree;
});

到:

d3_layout_treeVisitAfter(root, function(node) {
    // make sure size is null, we will make it null when we create the tree
    if(size === undefined || size == null) 
    { 
        node.x = (node.x - x0) * elementsize[0]; 
        node.y = node.depth * elementsize[1]; 
    } 
    else 
    { 
        node.x = (node.x - x0) / (x1 - x0) * size[0];
        node.y = node.depth / y1 * size[1]; 
    } 
    delete node._tree;
});

下面添加一个名为:elementsize 的新变量,并将其默认为 [ 1, 1 ] 到第 5731 行

var hierarchy = d3.layout.hierarchy().sort(null).value(null)
    , separation = d3_layout_treeSeparation
    , elementsize = [ 1, 1 ] // Right here
    , size = [ 1, 1 ];

在它下面有一个名为< code > tree . size = function(x)的方法。在该定义下增加以下内容:

tree.elementsize = function(x) {
    if (!arguments.length) return elementsize;
    elementsize = x;
    return tree;
};

最后,当你创建树的时候,你可以像这样改变元素大小

var tree = d3.layout.tree()
             .size(null)
             .elementsize(50, 240);
齐俊贤
2023-03-14

截至2016年,我能够实现这一目标,只需

tree.nodeSize([height, width])

https://github.com/mbostock/d3/wiki/Tree-Layout#nodeSize

API参考有点差,但是它非常简单。请确保在< code>tree.size([height,width])之后使用它,否则您将再次覆盖您的值。

更多参考:D3使用NodeSize在节点之间进行树布局分离

 类似资料:
  • 提示 页面模板源码免费开源,在uni-app的插件市场uView的 示例项目 中,在右上角选择"使用 HBuilderX 导入示例项目" 或者 "下载示例项目ZIP", 在HX运行项目即可看到和使用模板。 uView为用户制作了两个类型的分类页面,分别是左右联动,左右分开的场景。 这两个页面,为布局而非组件形式,可以根据自己的需求修改页面的结构,逻辑,样式。 左右联动 该场景左右可以联动,右边所有

  • 我对Vert.x非常陌生,就像几天前一样。我来自一个JAX式的,安逸的世界。我可能大错特错,请指正。 我的问题是:如何使顶点公开自己的REST接口(子路由器),以及如何将其子路由器注册到应用程序的主路由器中? 我尝试过类似的东西,但是当我请求/产品/所有:( } }

  • 我尝试按如下方式执行二叉树的垂直顺序遍历:1)找出每个节点与根节点之间的最小和最大水平距离2)创建一个hashmap,将水平距离映射到相应的节点(Map) 然而,我得到了不想要的输出,我认为在实现中有一些错误,因为算法对我来说似乎是正确的。 以下是完整的代码: 输出:{-1=[99999],0=[99999,12],-2=[99999],1=[99999],2=[99999]}那么我的apProc

  • 我有一个工作的D3树,我正试图转换成角。是v3树。 组件代码为: 如有任何帮助,将不胜感激 干杯KH

  • 我正在尝试打印一棵树,问题是我找不到任何其他方法,只能像这样打印它: 但有没有办法像这样打印它: 这是我的代码: 在这里,我为树节点创建了一个类,我知道代码很糟糕,但我仍然是初学者,我将在未来改进它。我使用列表来存储子列表和链表来对兄弟姐妹进行排序,因为它稍后在尝试打印实际树时会很有用。 我打印树的方式是这样的:打印当前节点,如果当前节点有任何子节点,则转到子节点,如果没有,则转到当前节点的父节点

  • 垂直对齐 1. grid-template-areas 属性值保持换行,并使用空格保持每列垂直对齐。 例如: .foo { grid-template-areas: "header header" "nav main" "footer ...."; } 2. grid、grid-template