D3.js 尝试使用d3树形图库将第二个父节点添加到子节点

D3.js 尝试使用d3树形图库将第二个父节点添加到子节点,d3.js,D3.js,我正在尝试创建一个D3树,并且能够在一定程度上完成任务,但在我的情况下,单个节点可能有多个父节点 但正如我所了解的,我仍然需要从一个根节点开始构建树,我做到了,并且能够构建树,现在我想向树节点添加第二个节点 var数据=[{ “儿童”:[{ “儿童”:[{ “儿童”:[{ “儿童”:[ ], “名称”:“层次结构子5”, “父节点”:“层次结构同级节点”, “关系”:“关系的父项”, “rid”:“A05900000VBecuaat” }], “名称”:“层次结构同级”, “父级”:“层次结构

我正在尝试创建一个
D3树
,并且能够在一定程度上完成任务,但在我的情况下,单个节点可能有多个父节点

但正如我所了解的,我仍然需要从一个根节点开始构建树,我做到了,并且能够构建树,现在我想向树节点添加第二个节点

var数据=[{
“儿童”:[{
“儿童”:[{
“儿童”:[{
“儿童”:[
],
“名称”:“层次结构子5”,
“父节点”:“层次结构同级节点”,
“关系”:“关系的父项”,
“rid”:“A05900000VBecuaat”
}],
“名称”:“层次结构同级”,
“父级”:“层次结构父级”,
“关系”:“关系的父项”,
“rid”:“A05900000VBKEYAAX”
}, {
“儿童”:[{
“儿童”:[
],
“名称”:“层次结构子1”,
“家长”:“ACME”,
“关系”:“关系的父项”,
“rid”:“A05900000VBKF7AAH”
}, {
“儿童”:[
],
“名称”:“层次结构子2”,
“家长”:“ACME”,
“关系”:“关系的父项”,
“rid”:“A05900000VBKFCAAX”
}, {
“儿童”:[
],
“名称”:“层次结构子3”,
“家长”:“ACME”,
“关系”:“关系的父项”,
“rid”:“A05900000VBKFAAX”
}, {
“儿童”:[
],
“名称”:“层次结构子4”,
“家长”:“ACME”,
“关系”:“关系的父项”,
“rid”:“A05900000VBKFMAX”
}],
“名称”:“ACME”,
“父级”:“层次结构父级”,
“关系”:“关系的父项”,
“rid”:“A05900000VBKEJAAX”
}],
“名称”:“层次结构父级”,
“父节点”:“这是测试第二个父节点”,
“关系”:“关系的父项”,
“rid”:“A05900000VBKEOAX”
}, {
“儿童”:[
],
“姓名”:“等级叔叔”,
“父母”:“祖父母”,
“关系”:“关系的父项”,
“rid”:“A05900000Vbkedah”
}, {
“儿童”:[
],
“姓名”:“等级大叔”,
“父母”:“祖父母”,
“关系”:“关系的父项”,
“rid”:“A05900000VBKENAAH”
}],
“姓名”:“祖父母”,
“父项”:“null”,
“关系”:“关系的父项”,
“rid”:“A05900000VBKETAX”
}];
//**********将平面数据转换为漂亮的树***************
//创建名称:节点映射
var dataMap=data.reduce(函数(映射,节点){
map[node.name]=节点;
返回图;
}, {});
//创建树数组
var treeData=[];
data.forEach(函数(节点){
//添加到父级
var parent=dataMap[node.parent];
如果(家长){
//如果子数组不存在,则创建它
(parent.children | |(parent.children=[]))
//将节点添加到子数组
.推送(节点);
}否则{
//父项为null或缺少
树数据推送(节点);
}
});
//*************生成树形图*****************
var保证金={
前20名,
右:120,,
底数:20,
左:120
},
宽度=960-margin.right-margin.left,
高度=500-margin.top-margin.bottom;
var i=0;
var tree=d3.layout.tree()
.尺寸([高度、宽度]);
var diagonal=d3.svg.diagonal()
.投影(功能(d){
返回[d.y,d.x];
});
var svg=d3.选择(“div#图表容器”).追加(“svg”)
.attr(“宽度”,宽度+边距。右侧+边距。左侧)
.attr(“高度”,高度+边距。顶部+边距。底部)
.附加(“g”)
.attr(“转换”、“平移”(+margin.left+)、“+margin.top+”);
根=树数据[0];
更新(根);
函数更新(源){
//计算新的树布局。
var nodes=tree.nodes(root).reverse(),
链接=树。链接(节点);
//为固定深度进行规格化。
nodes.forEach(函数(d){
d、 y=d.深度*180;
});
//声明节点…
var node=svg.selectAll(“g.node”)
.数据(节点、功能(d){
返回d.id | |(d.id=++i);
});
//输入节点。
var nodeEnter=node.enter().append(“g”)
.attr(“类”、“节点”)
.attr(“转换”,函数(d){
返回“translate”(“+d.y+”,“+d.x+”);
});
nodeEnter.append(“圆”)
.attr(“r”,10)
.样式(“填充”、“fff”);
nodeEnter.append(“文本”)
.attr(“x”,函数(d){
返回d.children | | d.| U儿童?-13:13;
})
.attr(“dy”,“.35em”)
.attr(“文本锚定”,函数(d){
返回d.children | d.| u children?“结束”:“开始”;
})
.文本(功能(d){
返回d.name;
})
.样式(“填充不透明度”,1);
//声明链接…
var link=svg.selectAll(“path.link”)
.数据(链接、功能(d){
返回d.target.id;
});
//输入链接。
link.enter()插入(“路径”,“g”)
.attr(“类”、“链接”)
.attr(“d”,对角线);
}
。节点圆{
填充:#fff;
笔画:钢蓝;
笔画宽度:3px;
}
.节点文本{
字体:12px无衬线;
}
.链接{
填充:无;
冲程:#ccc;
笔画宽度:2px;
}

看看这个例子

如果这没有帮助,您可能需要查看力定向图


另请看,与d3非常相似,但它处理网络(图形数据结构)以及树

如果这没有帮助,您可能需要查看力定向图


还可以看一看,与d3非常相似,但它处理网络(图形数据结构)和树

这个多父树看起来像我在这里需要的,但我无法理解
couplingParent1
couplingChild1
代码,这似乎是我在代码中需要做的事情,以使多父关系正常工作:-(从源代码看,似乎有一些自定义代码来绘制父关系(请参见文件底部)这个多父树看起来像我在这里需要的,但我无法理解
couplingParent1
couplingChild1
代码,这似乎是我在代码中需要做的事情