我正在尝试突出显示目标节点的所有连接链接和链接,直到布局结束。
第一级突出显示可以轻松实现如下 -
点击节点后,请致电highlight_paths(1)
;
function highlight_paths(stroke_opacity) {
return function(d,i){
d.sourceLinks.forEach(function(srcLnk){
d3.select("#link"+srcLnk.id).style("stroke-opacity", stroke_opacity);
});
d.targetLinks.forEach(function(srcLnk){
d3.select("#link"+srcLnk.id).style("stroke-opacity", stroke_opacity);
});
}
}
但我还不能正确编写递归算法来获取每个连接源和放大器的所有sourceLinks和targetLinks。目标节点。
所有的想法都表示赞赏!
感谢。
答案 0 :(得分:20)
我正在浏览sankey布局代码,并找到了遍历布局节点的广度优先搜索实现。关于BFS的一些知识 - http://www.cse.ohio-state.edu/~gurari/course/cis680/cis680Ch14.html
纯粹基于此,这里的功能是在两个方向上突出显示点击节点的所有路径 - 前进(目标)和后退(源)
希望这有助于某人!
工作示例 - http://bl.ocks.org/git-ashish/8959771
function highlight_node_links(node,i){
var remainingNodes=[],
nextNodes=[];
var stroke_opacity = 0;
if( d3.select(this).attr("data-clicked") == "1" ){
d3.select(this).attr("data-clicked","0");
stroke_opacity = 0.2;
}else{
d3.select(this).attr("data-clicked","1");
stroke_opacity = 0.5;
}
var traverse = [{
linkType : "sourceLinks",
nodeType : "target"
},{
linkType : "targetLinks",
nodeType : "source"
}];
traverse.forEach(function(step){
node[step.linkType].forEach(function(link) {
remainingNodes.push(link[step.nodeType]);
highlight_link(link.id, stroke_opacity);
});
while (remainingNodes.length) {
nextNodes = [];
remainingNodes.forEach(function(node) {
node[step.linkType].forEach(function(link) {
nextNodes.push(link[step.nodeType]);
highlight_link(link.id, stroke_opacity);
});
});
remainingNodes = nextNodes;
}
});
}
function highlight_link(id,opacity){
d3.select("#link-"+id).style("stroke-opacity", opacity);
}