【问题标题】:d3 Sankey - Highlight all connected paths from start to endd3 Sankey - 突出显示从头到尾的所有连接路径
【发布时间】:2013-10-05 08:58:05
【问题描述】:

我正在尝试突出显示所有连接的链接和目标节点的链接,直到布局结束。

第一级高亮可以很方便的实现如下——

点击节点时,调用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。

感谢所有想法!

谢谢。

【问题讨论】:

  • This 应该会有所帮助。
  • 谢谢@LarsKotthoff!这肯定会有所帮助,但我刚刚找到了解决方案,所以在这里发布。
  • 感谢@milen-pavlov 的格式化! :)

标签: d3.js sankey-diagram


【解决方案1】:

我正在浏览 sankey 布局代码,并找到了一个用于遍历布局节点的广度优先搜索实现。这里有一些关于 BFS 的知识 - http://www.cse.ohio-state.edu/~gurari/course/cis680/cis680Ch14.html

纯粹基于此,这里是突出显示从被点击节点的所有路径在两个方向上的功能 - 向前(目标)和向后(源)

希望这对某人有所帮助!

工作示例 -

http://bl.ocks.org/git-ashish/8959771

https://observablehq.com/@git-ashish/sankey-diagram

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

【讨论】:

  • 美丽的问题,美丽的答案。
  • 真的很好,但我注意到如果你点击一个节点,那么悬停突出显示似乎坏了。单击一个节点,然后再次单击(关闭遍历)。然后悬停不适用于突出显示的边缘。 (Chrome, OSX)
  • @schnee 现在已修复。同一个链接。悬停时,链接笔划不透明度会更改。但是由于单击突出显示在元素内联级别应用笔触不透明度,因此未应用悬停样式。我现在已经制作了!important,以便始终考虑它。通过 css 做到这一点是要走的路。
  • 什么是节点[step.linkType]? step.linkType 返回“sourceLinks”或“targetLinks”,但 node[sourceLinks] 是什么?我不断收到那行代码的“未定义”。
  • @DaoLam 考虑像树枝一样的“sourceLinks”或“targetLinks”,它们分别为您提供单击节点的源和目标节点。如果你能给我们指点小提琴,那就太好了。否则,我假设您的“节点”没有指向正确的数据集/数据。
猜你喜欢
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2018-09-10
  • 1970-01-01
相关资源
最近更新 更多