Javascript D3图形布局-具有多个父级的树结构
让我首先声明我对D3和Javascript是完全陌生的。通过一点实验,我试图开发一个类似树的结构,这个节点可以有多个父节点 输入: 包含节点和链接信息的JsonJavascript D3图形布局-具有多个父级的树结构,javascript,json,d3.js,layout,Javascript,Json,D3.js,Layout,让我首先声明我对D3和Javascript是完全陌生的。通过一点实验,我试图开发一个类似树的结构,这个节点可以有多个父节点 输入: 包含节点和链接信息的Json var graph = { "nodes": [ { "id" : 0}, { "id" : 1}, { "id" : 2}, { "id&
var graph = {
"nodes": [ { "id" : 0},
{ "id" : 1},
{ "id" : 2},
{ "id" : 3},
{ "id" : 4},
{ "id" : 5}
],
"links": [ { "target": 5, "source": 1 },
{ "target": 2, "source": 0 },
{ "target": 3, "source": 4 },
{ "target": 1, "source": 2},
{ "target": 1, "source": 0 },
]
};
注意:这只是作为我如何获得数据的参考,它可能有数千个节点
输出:
我希望输出像树结构一样,有点像,比如说节点必须以深度/层次结构绘制,根位于顶部,相同层次的节点以这样的方式排列,以最小化链接重叠
编辑:上述输入的输出假定零为根
我面临的问题:
请帮助我更好地理解这个话题,谢谢。整天都在断断续续地思考这个问题。使用内置的
d3
结构,我认为它与您将要得到的最接近。我已将您的数据转换为版本4示例:
.连接线{
冲程:#aaa;
笔画宽度:5px;
}
.节点圆{
指针事件:全部;
中风:无;
}
var svg=d3。选择(“svg”),
宽度=+svg.attr(“宽度”),
高度=+svg.attr(“高度”);
var simulation=d3.forceSimulation()
.force(“link”,d3.forceLink().id(函数(d){
返回d.id;
}))
.force(“电荷”,d3.forceManyBody())
.力(“中心”,d3.力中心(宽度/2,高度/2))
.force(“y”,d3.forceY())
变量图={
“节点”:[{
“id”:0
}, {
“id”:1
}, {
“id”:2
}, {
“id”:3
}, {
“id”:4
}, {
“id”:5
}],
“链接”:[{
“目标”:5,
“来源”:1
}, {
"目标":二,,
“来源”:0
}, {
"目标":三,,
“来源”:4
}, {
"目标":一,,
“来源”:2
}, {
"目标":一,,
“来源”:0
},
]
};
var link=svg.append(“g”)
.attr(“类”、“链接”)
.selectAll(“行”)
.数据(图表.链接)
.enter().append(“行”);
var node=svg.append(“g”)
.attr(“类”、“节点”)
.selectAll(“圆圈”)
.数据(图.节点)
.enter().append(“圆”)
.attr(“r”,10);
node.append(“标题”)
.文本(功能(d){
返回d.id;
});
模拟
.nodes(图.nodes)
。在(勾选)上;
模拟力(“链接”)
.links(图形链接);
函数勾选(){
var k=6*simulation.alpha();
//向上推源,向下推目标,形成弱树。
链接
.每个功能(d){
d、 source.y-=k,d.target.y+=k;
})
.attr(“x1”,函数(d){
返回d.source.x;
})
.attr(“y1”,函数(d){
返回d.source.y;
})
.attr(“x2”,函数(d){
返回d.target.x;
})
.attr(“y2”,功能(d){
返回d.target.y;
});
节点
.attr(“cx”,功能(d){
返回d.x;
})
.attr(“cy”,函数(d){
返回d.y;
});
}
我无法计算出您的预期输出。假设零是根节点,那么它将是。3到4会消失,因为它破坏了父/子关系。。。这是您期望的输出吗?@标记实际上输入只是作为我的输入的参考…它可能包含数千个节点,例外的输出是无论哪个节点是根节点都应该出现在顶部,然后是其子节点,以此类推,链接重叠最小。希望我能解释我自己;)但是我的图表是给定示例数据的预期输出吗?@标记不完全,级别1应该包含0作为根,那么它的较低级别2应该有2和1,就像您一样,但最后一个级别3应该只有5与1连接,第三级不应该再有一个1级了…谢谢你指出,我会根据给定的输入用正确的输出更新问题。我建议画一张图片。看了你的最后一句话,我更糊涂了,原来我是:)酷!它似乎适用于少量节点,让我尝试一下更大数量的节点,将发回结果。我按照您的链接到强制定向树,这更符合我所寻找的答案,但问题是,大量节点会变成一个集群……有没有办法为每个节点提供深度属性,如一级?@Mohit,你有没有编好的例子?我试图用随机数据重新创建,但没有正确的父/子结构,这是一个混乱。在上面的代码中,var k=6*simulation.alpha()
,6
是每个节点的强制距离。假设我使用此数据绘制图形…主要问题是根的深度,因此子节点的深度随刷新而变化。现在,如果我想让根始终位于顶部,并且它的深度是垂直的,那么?我能让自己明白吗?;)