【问题标题】:D3 force layout: Straight line instead of curve for links (but only for some links)D3 力布局:链接的直线而不是曲线(但仅适用于某些链接)
【发布时间】:2015-01-22 21:18:39
【问题描述】:

我有这个D3jsfiddle,它会生成下图:

这张图唯一让我困扰的是,如果两个节点之间只有一个链接,它就会被绘制成一条曲线。我认为如果这些链接只是直线会更好(箭头会很好)。假设微软和亚马逊之间应该只是一条直线(带箭头)。甲骨文和谷歌、索尼和LG等也是如此。

如何做到这一点?

【问题讨论】:

    标签: javascript svg d3.js force-layout


    【解决方案1】:

    这很容易。在您的 linkArc(d) 方法中,如果只有 1 个孩子,只需将 dr 参数设置为 0,如果有更多,则将其设置为默认值。这样节点之间就不会有任何曲线了。

    不过,第一步是确定有多少邻居。在您从链接中定义节点之后,一种简单的方法如下所示,尽管它不是最佳方法。

    links.forEach(function(d) {
        if (nodes[d.source.name].children==undefined) {
            nodes[d.source.name].children=0;
        }
        nodes[d.source.name].children++
    });
    

    完成后,您可以按如下方式调整线条的曲线:

    function linkArc(d) {
      var dx = d.target.x - d.source.x,
          dy = d.target.y - d.source.y,
          dr = (nodes[d.target.name].children>1 & nodes[d.source.name].children>1)?Math.sqrt(dx * dx + dy * dy):0;
      return "M" + d.source.x + "," + d.source.y + "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y;
    }
    

    结果会是这样的:

    我确信有更好的方法来解决这个问题,但这只是一个开始。 希望这会有所帮助。

    【讨论】:

    • 谢谢,但如果节点之间有多个连接,我需要保持曲线。看来,您的解决方案会使所有链接成为直线。
    • 抱歉,从问题中并不清楚你只在只有一对时才喜欢直线。
    • 没问题,我会给+1,因为如果其他人需要这样的东西,你的回答可能会有用,请保留答案。
    • 我做了一些实验,找到了解决问题的方法。你现在可以看看,看看是不是更好?
    • 暂时没时间,我回来看看,谢谢!
    【解决方案2】:

    这是基于@Nikos 的回答:

    links.forEach(function(d) {
        d.straight = 1;
        links.forEach(function(d1) {
            if ((d.source == d1.target) && (d1.source == d.target))
                d.straight = 0;
        });
    });
    

    function linkArc(d) {
      var dx = d.target.x - d.source.x,
          dy = d.target.y - d.source.y,
          dr = (d.straight == 0)?Math.sqrt(dx * dx + dy * dy):0;
      return "M" + d.source.x + "," + d.source.y +
          "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y;
    }
    

    产生正确的图表:(关于连接的直线度)

    jsfiddle

    【讨论】:

    • 感谢您发布解决方案!你可以选择你的答案作为正确的答案,我这边没问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多