我是 D3 的新手,我正在尝试创建交互式网络可视化。我已经复制了这个示例的大部分内容,但是我通过使用 SVG 的“线条”而不是“路径”将曲线更改为直线,并且我还根据节点所代表的数据缩放了节点。问题是我的箭头(使用 SVG 标记创建)位于行尾。由于一些节点很大,箭头隐藏在它们后面。我希望我的箭头显示在它们指向的节点的外侧边缘。
以下是我创建标记和链接的方式:
svg.append("svg:defs").selectAll("marker")
.data(["prereq", "coreq"])
.enter().append("svg:marker")
.attr("id", String)
.attr("viewBox", "0 -5 10 10")
.attr("refX", 15)
.attr("markerWidth", 6)
.attr("markerHeight", 6)
.attr("orient", "auto")
.append("svg:path")
.attr("d", "M0,-5L10,0L0,5");
var link = svg.selectAll(".link")
.data(force.links())
.enter().append("line")
.attr("class", "link")
.attr("marker-end", function(d) { return "url(#" + d.type + ")"; });
我注意到“refX”属性指定了箭头应该显示在离行尾多远的地方。我怎样才能使它取决于它指向的节点的半径?如果我不能这样做,我可以改为更改线条本身的端点吗?我猜我会在这个函数中这样做,它会在一切移动时重置线条的端点:
function tick() {
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; });
circle.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")";
});
text.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")";
});
}
哪种方法更有意义,我将如何实施?