Javascript D3力布局:链接用直线代替曲线(但仅适用于某些链接)
我有一个Javascript D3力布局:链接用直线代替曲线(但仅适用于某些链接),javascript,svg,d3.js,force-layout,Javascript,Svg,D3.js,Force Layout,我有一个D3,它生成以下图表: 这张图唯一让我感到困扰的是,如果两个节点之间只有一个链接,它将被绘制为曲线。我认为如果这些链接只是直线的话会更好(箭头就可以了)。假设微软和亚马逊之间应该是一条直线(带箭头)。甲骨文和谷歌、索尼和LG等公司的情况也一样 如何做到这一点?这很容易。在linkArc(d)方法中,如果只有1个子项,只需将dr参数设置为0,如果有更多子项,则将其设置为默认值。这样,节点之间就不会有任何曲线 不过,第一步将是确定有多少邻居。一种简单的方法是,在从链接定义节点之后,如下所示
D3
,它生成以下图表:
这张图唯一让我感到困扰的是,如果两个节点之间只有一个链接,它将被绘制为曲线。我认为如果这些链接只是直线的话会更好(箭头就可以了)。假设微软和亚马逊之间应该是一条直线(带箭头)。甲骨文和谷歌、索尼和LG等公司的情况也一样
如何做到这一点?这很容易。在
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;
}
结果如下:
我确信有更好的方法来解决这个问题,但这只是一个开始。
希望这有帮助。这是基于@Nikos的答案:
links.forEach(function(d) {
d.straight = 1;
links.forEach(function(d1) {
if ((d.source == d1.target) && (d1.source == d.target))
d.straight = 0;
});
});
及
屈服于正确的图表:(关于连接的平直度)
谢谢,但是如果节点之间有多个连接,我需要保留曲线。您的解决方案似乎会使所有链接都成直线。抱歉,从问题中不清楚只有一对时您才喜欢直线。没问题,我给+1,因为如果其他人需要这些东西,您的答案可能会有用,请保留答案。我做了一点实验,找到了解决这个问题的方法。你现在能看一看是不是更好?现在没有时间,但我会回来看一看,谢谢!感谢您发布解决方案!您可以选择正确的答案,我这边没有问题:)
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;
}