突出显示根

时间:2018-01-16 14:01:54

标签: javascript d3.js path tree highlight

我尝试通过更改节点和链接的填充来突出显示从鼠标所在节点到根节点的路径。我正在Block使用迈克的Radial Tidy Tree。

我尝试了node.ancestors(),但这不是一个功能。 当我尝试创建变量并将node.parent放入其中,或使用d3.select(this.parentNode)时,它也不起作用。

我在Google网上论坛上发现有人试图做相反的事情,Mike Bostock told them问题来自他的树数据。

我使用了Mike给出的方法并且完美地运行了:

node.on("mouseover", function(p) {

  //color the links
  link.filter(function(d) {
    for (d = d.source; d; d = d.parent) {
      if (d === p) return true;

      }
  }).style("stroke","black");

  //color the nodes 
  node.filter(function(d) {
    while(d = d.parent){
      if(d === p) return true ;
    }
  }).style("fill","red");

});

它会改变颜色,我也跟mouseout做了相反的事情。 但我不能用相反的方向配置它(父节点到root的节点),有人可以帮我做吗?

2 个答案:

答案 0 :(得分:3)

您需要一种稍微不同的方法来获取从子节点到根节点的节点。想到的一个选项是收集链中所有节点的列表:

node.on("mouseover", function(p) {

    var nodes = [];
    nodes.push(p);

    while(p.parent) {
        p = p.parent;
        nodes.push(p);
    }

由于每个拥有父节点的节点都有一个包含其父对象的属性,因此这将使您获得所选节点上游的每个节点。也选择了鼠标悬停节点,这将允许我们选择链接。

现在很容易设置节点样式,只需查看节点的数据是否位于我们刚创建的节点数组中:

  node.filter(function(d) {
        if(nodes.indexOf(d) !== -1) return true;
  }).style("fill","steelblue");

要为节点着色,我们使用类似的方法,但检查每个链接的目标是否在我们的节点数组中:

  //color the links
  link.filter(function(d) {
     if(nodes.indexOf(d.target) !== -1) return true;
  }).style("stroke","orange");

必须是目标 - 因为每个节点只有一条路径终止,但是每个节点可能有几条路径,这就是为什么我们需要将原始节点的数据推入数组

Here's设置只有上游突出显示。

答案 1 :(得分:3)

为了完整性:ancestors() 执行工作,但您必须在层次结构上调用它,而不是选择:

.on("mouseover", function(d) {
    var filtered = node.filter(function(e) {
        return d.ancestors().indexOf(e) > -1
    });
    filtered.selectAll("circle").style("fill", "red");
    filtered.selectAll("text").style("fill", "red");
})

以下是更新的bl.ocks:https://bl.ocks.org/anonymous/bb5be85d509eb7824e95d193c4fb6d27/e87fb16f8058f85719647dde561bff12f998361a