D3力布局:直线而不是曲线的链接(但仅适用于某些链接)

Viv*_*idD 4 javascript svg d3.js force-layout

我有这个D3 jsfiddle产生以下图表:

在此输入图像描述

困扰我的唯一问题是,如果两个节点之间只有一个链接,则将其绘制为曲线.我认为如果这样的链接只是直线会更好(箭头就可以了).让我们说微软和亚马逊之间应该只是一条直线(带箭头).甲骨文与谷歌,索尼和LG等同样如此.

怎么做到这一点?

Nik*_*kos 6

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

但是,第一步是确定有多少邻居.在您从链接定义节点之后,一种简单的方法就像下面这样,尽管它不是最佳的.

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

结果将是这样的:

这里

我相信有更好的方法可以解决这个问题,但这是一个开始.希望这可以帮助.