根据行数据创建层次结构

Create hierarchy from row data

本文关键字:创建 层次结构 数据      更新时间:2023-09-26

我正在尝试为d3.js的树布局创建层次结构,但我有行数据,这意味着只有链接和一些链接真正相互递归,就像在链接中的某些时候,两个不同的源有相同的目标,所以通过基本的d3.js树函数,它会遇到这种情况。

我还有其他选择吗?

例如,我有这样的数据

{ source: "main1", target: "level 3"}  
{ source: "main2", target: "level 3"}
{ source: "level 3", target: "level 4"}    

所以这将是像这个场景

0     0
 '   /
   0
   |
   0

而且这些不在一个根下的父母也意味着树上有两个不同的父母!!!

任何有用的链接都将感谢

提前感谢

你说你有代表任意有向图(可能是非循环图?)的数据,你想从中创建一个层次结构。正如你所指出的,它并不代表层次结构。那么你期待什么呢?我认为你的"问题"的答案是:

"你不能这么做。你需要使用不需要层次结构的不同可视化。"

也许您想要像
这样的DAG可视化https://github.com/nickholub/d3-dag-visualization

如果您确信您想要一个层次结构,请提供一整套示例数据以及您期望的结果。我们无法从您提供的内容中猜测您想要什么。

是的,这不可能直接用d3.js实现,但有其他方法可以用d3.js 实现

1) 而不是使用

tree.links(nodes);

对于与每个节点连接的链接,我们可以使用

d3.layout.hierarchy()

并覆盖

.links(nodes)

方法并通过我们自己的方式管理链接连接意味着原始子节点将保留在您想要将其放在它的多个父节点下的位置,并通过提供一些唯一的id来标识节点并连接它们。注意:在这里,如果你使用的是从示例中复制过去的代码,你需要在

  var link = svgGroup.selectAll("path.link")
        .data(links, function(d) {
            return d.target.id;
        });

因为现在它不依赖于子链接和父链接,所有链接都是自己的,所以给它们id并使用该id作为过滤器,而不是使用目标id

2) 或者你可以自己创建自己的函数,创建一个数组或对象,它像链接一样保存对象,你只需要根据你的连接逻辑给它们源、目标和链接id。你可以随心所欲地玩它,因为它是你自己的,你可以添加额外的属性等。