D3 force layout:直线而不是曲线链接(但仅适用于某些链接)
D3 force layout: Straight line instead of curve for links (but only for some links)
我有这个 D3
jsfiddle 生成下图:
这个图唯一让我困扰的是,如果两个节点之间只有一个link,它会被绘制成一条曲线。我认为如果这样的 links 只是直线会好得多(箭头会很好)。假设微软和亚马逊之间应该只是一条直线(带箭头)。甲骨文和Google、索尼和LG等
如何实现?
这很容易。在您的 linkArc(d)
方法中,如果只有 1 个 child,则只需将 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;
});
});
和
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;
}
屈服于正确的图表:(关于连接的直线度)
我有这个 D3
jsfiddle 生成下图:
这个图唯一让我困扰的是,如果两个节点之间只有一个link,它会被绘制成一条曲线。我认为如果这样的 links 只是直线会好得多(箭头会很好)。假设微软和亚马逊之间应该只是一条直线(带箭头)。甲骨文和Google、索尼和LG等
如何实现?
这很容易。在您的 linkArc(d)
方法中,如果只有 1 个 child,则只需将 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;
});
});
和
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;
}
屈服于正确的图表:(关于连接的直线度)