Javascript JS/d3.JS:为源/目标链接创建组
我一直在尝试根据它们的链接给一些节点上色,但我不知道怎么做。这是我当前的图表: 我一直在尝试自动为同一集群内的所有节点着色(即通过作为集群内任何节点的源或目标相互连接),但到目前为止,我所有的尝试都是徒劳的 我听说我可能需要做一个递归函数,但我的递归是自学的,从根本上说是错误的。这是我目前的代码:Javascript JS/d3.JS:为源/目标链接创建组,javascript,d3.js,Javascript,D3.js,我一直在尝试根据它们的链接给一些节点上色,但我不知道怎么做。这是我当前的图表: 我一直在尝试自动为同一集群内的所有节点着色(即通过作为集群内任何节点的源或目标相互连接),但到目前为止,我所有的尝试都是徒劳的 我听说我可能需要做一个递归函数,但我的递归是自学的,从根本上说是错误的。这是我目前的代码: function assignGroup() { var groupedNodes = []; for(var i = 0; i < gNodes.length; i++) { if
function assignGroup() {
var groupedNodes = [];
for(var i = 0; i < gNodes.length; i++) {
if(nodes[i].group !== undefined) {
nodes[i].group = undefined;
}
}
for(var i = 0; i < nodes.length; i++) {
if(nodes[i].group === undefined) {
nodes[i].group = i;
recursive(nodes[i],i);
}
}
function recursive(rNode, rGrp) {
var tempSrc = hasSrc(rNode);
var tempTarg = hasTarg(rNode);
if(tempSrc == null && tempTarg == null)
return;
if(tempSrc != null && tempSrc.group === undefined) {
tempSrc.group = rGrp;
recursive(tempSrc, rGrp);
}
if(tempTarg != null && tempTarg.group === undefined) {
tempTarg.group = rGrp;
recursive(tempTarg, rGrp);
}
}
function hasTarg(eNode) {
for(var i = 0; i < edges.length; i++) {
if(nodes.name == edges[i].source)
return getNode(nodes, edges[i].target);
else
return null;
}
}
function hasSrc(eNode) {
for(var i = 0; i < edges.length; i++) {
if (nodes.name == edges[i].target)
return getNode(edges[i].source);
else
return null;
}
}
function getNode(id) {
console.log(id);
for(var i = 0; i < nodes.length; i++) {
if(id == nodes[i].name) {
return nodes[i];
}
}
return null;
}
以下是节点数据集的预期结果:
"nodes":
[
{
"name": "Ben",
"group": 1
},
{
"name": "May",
"group": 1
},
{
"name": "Jack",
"group": 2 /*Arbitrary group (Ungrouped)*/
},
{
"name": "Francis",
"group": 3 /*Arbitrary group (Ungrouped)*/
},
{
"name": "Owen",
"group": 1
},
{
"name": "Blake",
"group": 1
},
{
"name": "Julia",
"group": 1
},
{
"name": "Liam",
"group": 4 /*Arbitrary group (Ungrouped)*/
}
]
编辑:这是JSFIDLE:这是我的解决方案。首先,我们给每个节点一个不同的编号:
data.nodes.forEach(function(d, i) {
d.group = i
});
你知道,数字本身并不重要
然后,我们检查每个节点的名称是否位于边
数组中每个对象的源
或目标
。如果是,我们将其编号提供给节点
数组中的源和目标对应方:
data.nodes.forEach(function(d) {
data.edges.forEach(function(e) {
if (e.source === d.name || e.target === d.name) {
data.nodes.find(function(f) {
return f.name === e.source
}).group = d.group;
data.nodes.find(function(f) {
return f.name === e.target
}).group = d.group;
}
})
})
这就像一个传染过程:在源
或目标
上找到其名称的第一个节点传播其编号。再说一次,数字本身并不重要
下面是一个演示:
var数据={
“节点”:[{
“姓名”:“本”,
}, {
“姓名”:“可能”,
}, {
“姓名”:“杰克”,
}, {
“姓名”:“弗朗西斯”,
}, {
“姓名”:“欧文”,
}, {
“姓名”:“布莱克”,
}, {
“姓名”:“朱莉娅”,
}, {
“姓名”:“利亚姆”,
}],
“边缘”:[{
“来源”:“本”,
“目标”:“可能”
}, {
“来源”:“本”,
“目标”:“布莱克”
}, {
“来源”:“本”,
“目标”:“欧文”
}, {
“来源”:“欧文”,
“目标”:“朱莉娅”
}]
};
data.nodes.forEach(函数(d,i){
d、 组=i
});
data.nodes.forEach(函数(d){
data.edges.forEach(函数(e){
if(e.source==d.name | | e.target==d.name){
data.nodes.find(函数(f){
返回f.name==e.source
}).组=d组;
data.nodes.find(函数(f){
返回f.name==e.target
}).组=d组;
}
})
})
console.log(数据)
Wow!再次非常感谢你!:)很好用!太糟糕了,最多投票数是1。。非常感谢你的帮助!只需对您的答案进行一个小的编辑,当我运行包含更多节点条目的数据时,我意识到获取的组号来自最近的组号(即获取更高的组号),并且由于组号是非递归的,因此仅更改阵列底部(后面)的源/目标对的组号。因此,我将组号设置为:(getGroup(e.source)Beatrice
,这是组9,意味着第一个重复的组是9。编辑:看来我们同时发布了评论!很高兴知道问题“自行解决”。。。
data.nodes.forEach(function(d) {
data.edges.forEach(function(e) {
if (e.source === d.name || e.target === d.name) {
data.nodes.find(function(f) {
return f.name === e.source
}).group = d.group;
data.nodes.find(function(f) {
return f.name === e.target
}).group = d.group;
}
})
})