Javascript D3.js强制布局:显示任意节点的根路径
我正在使用d3.js的force布局,我需要在图中显示根目录的路径。点击“任务10”节点,它会显示路径(任务10->任务6->任务4->任务1)。根目录将被识别为相同的源和目标,但此信息我只传递数据。我的数据包含具有节点路径信息的“根路径”,如“任务10”根路径为[“任务6”、“任务4”、“任务1”] 我完整的图形代码可以在这里看到 我正在写下面的方法,以便在单击特定节点时,它将显示根路径。但目前它只显示1个节点。我不知道如何迭代所有其他节点列表Javascript D3.js强制布局:显示任意节点的根路径,javascript,d3.js,Javascript,D3.js,我正在使用d3.js的force布局,我需要在图中显示根目录的路径。点击“任务10”节点,它会显示路径(任务10->任务6->任务4->任务1)。根目录将被识别为相同的源和目标,但此信息我只传递数据。我的数据包含具有节点路径信息的“根路径”,如“任务10”根路径为[“任务6”、“任务4”、“任务1”] 我完整的图形代码可以在这里看到 我正在写下面的方法,以便在单击特定节点时,它将显示根路径。但目前它只显示1个节点。我不知道如何迭代所有其他节点列表 function rootPath(d){
function rootPath(d){
var curNodeDetail = d.details.RootPath;
var source=[],target=[],i=0,j=0;
source[i] = d.name;
target[i] = curNodeDetail[i];
links.style("stroke-opacity", function(o) {
if(source[i] === o.source.name && target[i] === o.target.name){
source[i+1] = curNodeDetail[i];
target[i+1] = curNodeDetail[i+1];
i++;
return 1;
}
else
return 0.1;
})
.attr("marker-end", function(o){
if(source[j] === o.source.name && target[j] === o.target.name){
j++;
return "url(#arrowhead)";
}
else
return "url(#arrowhead2)";
});
}
将d.details.rootpath转换为d3.set并添加当前节点,然后询问每个链接,查看两端是否都是该集合的一部分 这适用于链接,但对于节点-->
}以下功能可能有用:-
function rootPath(d){
var curNodeDetail = d.details.RootPath;
var rootMap = rootPathItinerary(d.name,curNodeDetail);
links.style("stroke-opacity", function(o) {
return (rootMap.has(o.source.name) && (rootMap.get(o.source.name) === o.target.name)) ? 1 : 0.1;
})
.attr("marker-end", function(o){
return (rootMap.has(o.source.name) && (rootMap.get(o.source.name) === o.target.name)) ? "url(#arrowhead)" : "url(#arrowhead2)";
});
}
function rootPathItinerary(node,rootPathDet){
var i=0;
var map = d3.map();
map.set(node,rootPathDet[i]);//10,6
while(i+1 <rootPathDet.length){ //6,4,1
map.set(rootPathDet[i],rootPathDet[i+1]) ; //6,4 ; 4,1
i++;
}
return map;
}
函数根路径(d){
var curNodeDetail=d.details.RootPath;
var rootMap=rootpathcinerary(d.name,curNodeDetail);
样式(“笔划不透明度”,函数(o){
return(rootMap.has(o.source.name)&&(rootMap.get(o.source.name)==o.target.name))?1:0.1;
})
.attr(“标记结束”,功能(o){
return(rootMap.has(o.source.name)&(rootMap.get(o.source.name)==o.target.name))?“url(#arrowhead)”:“url(#arrowhead2)”;
});
}
函数rootPathCinerary(节点,rootPathDet){
var i=0;
var map=d3.map();
set(node,rootPathDet[i]);//10,6
而(i+1)我认为map(键值对)对于查询每个链接都很有用。在map中,我将把源作为键插入,把目标作为值插入。让我们为任务10取一个ex,我将插入(“任务10”,“任务6”,“任务4”,“任务1”),每个链接都将在map中签入。我不知道如何使用d3.map()实现这一点…我会搜索它。谢谢你,我已经实现了:)
function rootPath(d){
var curNodeDetail = d.details.RootPath;
var rootMap = rootPathItinerary(d.name,curNodeDetail);
links.style("stroke-opacity", function(o) {
return (rootMap.has(o.source.name) && (rootMap.get(o.source.name) === o.target.name)) ? 1 : 0.1;
})
.attr("marker-end", function(o){
return (rootMap.has(o.source.name) && (rootMap.get(o.source.name) === o.target.name)) ? "url(#arrowhead)" : "url(#arrowhead2)";
});
}
function rootPathItinerary(node,rootPathDet){
var i=0;
var map = d3.map();
map.set(node,rootPathDet[i]);//10,6
while(i+1 <rootPathDet.length){ //6,4,1
map.set(rootPathDet[i],rootPathDet[i+1]) ; //6,4 ; 4,1
i++;
}
return map;
}