我正在尝试按照此 d3noob's block 添加带有箭头的弯曲链接给我的codepen .
添加 2 个节点(添加节点
按钮)并从选择框中选择源节点和目标节点后,当我按添加链接
按钮时,它不会显示但是,节点会在屏幕上重新调整,从而表明已创建链接。
我添加了以下代码(包括codepen中的一些变量定义)
path.attr("d", function(d) {
var dx = d.target.x - d.source.x,
dy = d.target.y - d.source.y,
dr = Math.sqrt(dx * dx + dy * dy);
return "M" +
d.source.x + "," +
d.source.y + "A" +
dr + "," + dr + " 0 0,1 " +
d.target.x + "," +
d.target.y;
});
这是早些时候:
link.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
最佳答案
这是因为您实际上尚未创建任何对象来更改其属性,因此在实际创建任何链接之前,您尝试在文件顶部创建强制链接的路径。您需要根据“重新启动”函数中的链接创建路径,然后在“勾选”函数中更新它们的属性。这是一个代码笔:https://codepen.io/anon/pen/RBazVp?editors=0010
以下是相关更改:
function restart() {
...
...
link = link.data(links);
link.enter()
.append('path')
.attr('class', 'link');
link.exit().remove();
force.start();
...
...
}
function tick() {
link.attr("d", function(d) {
var dx = d.target.x - d.source.x,
dy = d.target.y - d.source.y,
dr = Math.sqrt(dx * dx + dy * dy);
return (
"M" +
d.source.x +
"," +
d.source.y +
"A" +
dr +
"," +
dr +
" 0 0,1 " +
d.target.x +
"," +
d.target.y
);
});
...
...
}
要向链接添加箭头:
var arrows = svg.append("defs")
.selectAll("marker")
.data(["arrow"])
.enter()
.append("marker")
.attr("id", String)
.attr("viewBox", "0 -5 10 10")
.attr("refX", 15)
.attr("refY", -1.5)
.attr("markerWidth", 6)
.attr("markerHeight", 6)
.attr("orient", "auto")
.append("path")
.attr("d", "M0,-5L10,0L0,5");
function restart() {
...
...
link = link.data(links);
link.enter()
.append('path')
.attr('class', 'link')
.attr('marker-end', 'url(#arrow)');
link.exit().remove();
force.start();
...
...
}
有趣的是,您只需要定义和创建箭头一次,并且更改“marker-end”属性将自动生成箭头的另一个副本。非常整洁!
关于javascript - D3 弯曲链接,箭头未出现在屏幕上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51378977/