【问题标题】:D3 Tree Graph - How to transition links when using straight line, not diagonalD3 树图 - 使用直线而不是对角线时如何转换链接
【发布时间】:2016-03-10 05:37:42
【问题描述】:

我正在使用这个 JS Fiddle:http://jsfiddle.net/f1nzagyw/

我想将示例从对角线更改为直线,我已经能够做到,但是当我单击节点以展开或缩短图表时,旧链接不会从图表中删除,所以我最终有多个链接。有人可以建议我如何使用直线转换原始链接和转换节点吗?当我从对角线移动到直线时,它似乎发生了变化。

我添加了 lineFunction 并在链接中使用它,正如您在小提琴中看到的那样:

     var lineFunction = d3.svg.line()
        .x(function(d) { return d.x; })
        .y(function(d) { return d.y; })
        .interpolate("linear");

我还附加了“线”和 x/y 坐标:

 var link = svg.selectAll("path.link")
      .data(links)
      .enter().append("line")
      .attr("class", "link")
      .attr("x1", function(d) { return d.source.y; })
      .attr("y1", function(d) { return d.source.x; })
      .attr("x2", function(d) { return d.target.y; })
      .attr("y2", function(d) { return d.target.x; });

另外,将链接保持在节点后面的最佳方法是什么,以便链接在节点后面而不是前面?我以为我只需要将链接的代码放在节点上方,但这似乎不起作用。

感谢任何帮助。 谢谢

【问题讨论】:

    标签: javascript d3.js graph hierarchy graphing


    【解决方案1】:

    问题 1

    旧链接没有更新

    你在做:

    var link = svg.selectAll("path.link")
          .data(links)
    

    这是错误的,因为没有path DOM 有一个line DOM 所以你的选择是错误的。

    你应该这样做:

    var link = svg.selectAll(".link")
        .data(links)
    

    问题 2

    将链接保留在节点后面的最佳方法:

    首先创建链接,然后创建节点,现在链接将出现在节点后面。

    //create link first
    link.enter().append("line")
        .attr("class", "link")
        .attr("x1", function(d) {
          return d.source.y;
        })
        .attr("y1", function(d) {
          return d.source.x;
        })
        .attr("x2", function(d) {
          return d.target.y;
        })
        .attr("y2", function(d) {
          return d.target.x;
        });
    
      // Transition links to their new position.
      link.transition()
        .duration(duration)
        .attr("d", lineFunction)
        .attr("x1", function(d) {
          return d.source.y;
        })
        .attr("y1", function(d) {
          return d.source.x;
        })
        .attr("x2", function(d) {
          return d.target.y;
        })
        .attr("y2", function(d) {
          return d.target.x;
        });;
    
      // Transition exiting nodes to the parent's new position.
      link.exit()
        .remove();
       //create nodes
      // Enter any new nodes at the parent's previous position.
      var nodeEnter = node.enter()
        .append("g")
        .attr("class", "node")
        .attr("transform", function(d) {
          return "translate(" + source.y0 + "," + source.x0 + ")";
        })
        .on("click", click);
    

    工作代码here

    编辑

    为确保节点始终位于顶部,请制作两组。

    var svglink = svg.append("g");//add links inside this group
    var svgnode = svg.append("g");//add nodes inside this group
    

    现在,当您创建链接时,请执行此操作以确保它们位于节点下方。

      // Update the links…
      var link = svglink.selectAll(".link")
        .data(links)
    
      // Update the nodes…
      var node = svgnode.selectAll("g.node")
        .data(nodes, function(d) {
          return d.id || (d.id = ++i);
        });
    

    工作示例here

    【讨论】:

    • @Cyril..非常感谢您抽出宝贵的时间。一件事..看起来链接最初位于节点后面,但是一旦单击节点以展开或折叠图形,链接就会再次移动到节点的前面..是否可以将它们完全保留在节点后面次?
    • 当我删除折叠功能 (root.children.forEach(collapse);) 时,一切看起来都很棒,这样整个图表就会立即显示,但展开/折叠会将链接推到节点前面
    • 是的,它有问题....修复了问题检查我的编辑部分我现在已经修复了:)
    • 非常感谢。我正在努力扩展您的示例并进行了一些补充,但也遇到了更多问题。我在这里发布了一个新问题stackoverflow.com/questions/35932405/…。如果您有时间看一下,我们将不胜感激。在这里再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2020-04-06
    • 1970-01-01
    相关资源
    最近更新 更多