javascript-JS / d3.js:为源/目标链接创建组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-JS / d3.js:为源/目标链接创建组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5257字,纯文字阅读大概需要8分钟。
内容图文
我一直在尝试根据某些节点的链接为它们着色,但是我不确定该怎么做.这是我当前的图形:
我一直在尝试自动为同一集群中的所有节点着色(即通过作为集群中任何节点的源或目标相互连接),但到目前为止我的所有尝试都是徒劳的.
我听说可能需要执行递归函数,但是我的递归是自学的,从根本上来说是错误的.这是我当前的代码:
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",
},
{
"name": "May",
},
{
"name": "Jack",
},
{
"name": "Francis",
},
{
"name": "Owen",
},
{
"name": "Blake",
},
{
"name": "Julia",
},
{
"name": "Liam",
}
],
"edges":
[
{
"source":"Ben",
"target":"May"
},
{
"source":"Ben",
"target":"Blake"
},
{
"source":"Ben",
"target":"Owen"
},
{
"source":"Owen",
"target":"Julia"
}
]
}
这是我的数据集对节点的预期结果:
"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)*/
}
]
编辑:这是jsfiddle:https://jsfiddle.net/ehnf76xg/2/
解决方法:
这是我的解决方案.首先,我们给每个节点一个不同的数字:
data.nodes.forEach(function(d, i) {
d.group = i
});
如您所知,数字本身并不重要.
然后,我们检查每个节点的名称是否在edges数组中每个对象的源或目标处找到.如果是,我们将其编号同时提供给节点数组中的源和目标通讯者:
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": [{
"name": "Ben",
}, {
"name": "May",
}, {
"name": "Jack",
}, {
"name": "Francis",
}, {
"name": "Owen",
}, {
"name": "Blake",
}, {
"name": "Julia",
}, {
"name": "Liam",
}],
"edges": [{
"source": "Ben",
"target": "May"
}, {
"source": "Ben",
"target": "Blake"
}, {
"source": "Ben",
"target": "Owen"
}, {
"source": "Owen",
"target": "Julia"
}]
};
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;
}
})
})
console.log(data)
现在,让我们在真实的力向图表中进行查看:
var data = {
"nodes": [{
"name": "Ben",
},{
"name": "May",
}, {
"name": "Jack",
}, {
"name": "Liam",
},{
"name": "Francis",
}, {
"name": "Owen",
}, {
"name": "Blake",
}, {
"name": "Julia",
}],
"edges": [{
"source": "Ben",
"target": "May"
}, {
"source": "Ben",
"target": "Blake"
}, {
"source": "Ben",
"target": "Owen"
}, {
"source": "Owen",
"target": "Julia"
}]
};
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 svg = d3.select("svg")
var force = d3.forceSimulation()
.force("link", d3.forceLink()
.id(function(d) {
return d.name
}))
.force("charge", d3.forceManyBody().strength(-2))
.force("collide", d3.forceCollide(15))
.force("center", d3.forceCenter(150, 70));
var edges = svg.selectAll("line")
.data(data.edges)
.enter()
.append("line")
.style("stroke", "#aaa")
.style("stroke-width", 2);
var color = d3.scaleOrdinal(d3.schemeCategory10);
var nodes = svg.selectAll("circle")
.data(data.nodes)
.enter()
.append("circle")
.attr("r", 10)
.style("stroke", "#444")
.style("stroke-width", 2)
.style("fill", function(d) {
return color(d.group);
})
force.nodes(data.nodes);
force.force("link")
.links(data.edges);
force.on("tick", function() {
edges.attr("x1", function(d) {
return d.source.x;
})
.attr("y1", function(d) {
return d.source.y;
})
.attr("x2", function(d) {
return d.target.x;
})
.attr("y2", function(d) {
return d.target.y;
})
nodes.attr("cx", function(d) {
return d.x;
})
.attr("cy", function(d) {
return d.y;
});
});
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>
内容总结
以上是互联网集市为您收集整理的javascript-JS / d3.js:为源/目标链接创建组全部内容,希望文章能够帮你解决javascript-JS / d3.js:为源/目标链接创建组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。