Я новичок в D3, и я пытаюсь создать визуализацию интерактивной сети. Я скопировал большие части примера this, но я изменил изогнутые линии на прямые, используя SVG «линии», а не «пути», и я также масштабировал узлы в соответствии с данными, которые они представляют. Проблема в том, что мои стрелки (созданные с помощью SVG-маркеров) находятся на концах строк. Поскольку некоторые узлы большие, стрелки скрываются за ними. Я хотел бы, чтобы мои стрелки отображались прямо у внешнего края узла, на который они указывают.Получить стрелки, чтобы указать на внешний край узла в D3
Вот как я создаю маркеры и ссылки:
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 + ")";
});
}
Какой подход имеет смысл, и как бы я это осуществить?
[Этот вопрос] (http://stackoverflow.com/questions/16568313/arrows-on-links-in-d3js-force-layout/16568625) должен помочь. –