D3.js强制布局:显示任何节点

时间:2016-01-31 02:03:38

标签: javascript d3.js

我正在使用d3.js的强制布局,我需要在图中显示根的路径。在点击“任务10”节点时,它应该显示路径(任务10->任务6->任务4->任务1)。 Root将被识别为相同的源和目标,但此信息仅传递给数据。我的数据包含具有节点路径信息的“RootPath”,例如“任务10”RootPath是[“任务6”,“任务4”,“任务1”]。

我在这里可以看到完整的图表代码http://plnkr.co/edit/EvpNC6B5DBWczNXKiL82?p=preview

我正在编写下面的方法,以便在点击特定节点时它将显示根路径。但目前它只显示1个节点。我不知道如何迭代所有其他节点列表。

  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)";
        });
  }

2 个答案:

答案 0 :(得分:0)

将d.details.rootpath转换为d3.set并添加当前节点,然后询问每个链接以查看两端是否属于该集合的一部分。

这适用于您的链接,但您必须为节点执行相同操作 - >

var curNodeDetail = d.details.RootPath;
var rootMap = d3.set (curNodeDetail);
rootMap.add(d.name);
links.style("stroke-opacity", function(o) {
        return (rootMap.has(o.source.name) && rootMap.has (o.target.name)) ? 1 : 0.1;
    })
    .attr("marker-end", function(o){
            return (rootMap.has(o.source.name) && rootMap.has (o.target.name)) ? "url(#arrowhead)" : "url(#arrowhead2)";
    });

}

答案 1 :(得分:0)

以下功能非常有用: -

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;
}