我已经创建了一个类似于这个力导向图的图表:http://bl.ocks.org/d3noob/5141278 :
以链接为例:Sarah与James相连,James与Sarah相连。有没有办法只用一条箭头,并在两端添加三角形,而不是用两个方向上的箭头使页面混乱?
![enter image description here](https://istack.dev59.com/2dJhc.webp)
var path = svg.append("svg:g").selectAll("path")
.data(force.links())
.enter().append("svg:path")
.attr("class", "link")
.attr("marker-end", "url(#end)")
.attr("marker-start", "url(#end");
这里有一个例子(点击此处)。但是由于SVG规范指定了箭头指向的方向应如何计算,因此它并不完美,特别是:
如果只有一个从顶点出发的路径段(例如,开放路径上的第一个顶点),则标记的正x轴应指向从顶点出发的路径段的切向量的相同方向。(有关路径段方向性的更彻底讨论,请参阅“路径”元素实现说明。)
在这些情况下,您可以自己计算和指定箭头的角度以修复方向。
function tick() {
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 + " " +
d.target.x + "," +
d.target.y;
});
这是更新后的 fiddle,可查看结果:http://jsfiddle.net/6w2La/2/ - Bubblesvis.append("defs").selectAll("marker")
.data(["arrow"])
.enter().append("marker")
.attr("id", "markerEnd")
.attr("viewBox", "0 -5 10 10")
.attr("refX", 19)
.attr("refY", -0,7)
.attr("markerWidth", 6)
.attr("markerHeight", 6)
.attr('markerUnits', "userSpaceOnUse")
.attr("orient", "auto")
.append("path")
.attr("d", "M0,-5L10,0L0,5");
vis.append("defs").selectAll("marker")
.data(["arrow"])
.enter().append("marker")
.attr("id", "markerStart")
.attr("viewBox", "0 -5 10 10")
.attr("refX", -12)
.attr("refY", -0,7)
.attr("markerWidth", 6)
.attr("markerHeight", 6)
.attr('markerUnits', "userSpaceOnUse")
.attr("orient", "auto")
.append("path")
.attr("d", "M0,0L10,-5L10,5Z");
正如你所看到的,一个被称为“markerStart”,另一个被称为“markerEnd”,它们现在是相反的方向。
路径看起来就像这样:
hlink.enter().append("path")
.attr("class", "hlink")
.attr("marker-start", "url(#markerStart)")
.attr("marker-end", "url(#markerEnd)");