在过去的几天里,我一直在努力解决这个问题:我有一个力有向图,可以像这个例子一样标记它的边缘。我面临的问题是,当图形更新时(即:在用户单击时添加图形上的一个节点)它会更新图形,但它会留下我之前写的旧边标签:
附加新图表之前和之后:
如您所见,我的边缘标签在更新后仍然存在。我有一个每次新数据进入时都会调用的函数,在这个函数中我有以下代码来绘制标签:
path_text = svg.selectAll(".path")
.data(force.links(), function(d){ return d.name;})
.enter().append("svg:g");
path_text.append("svg:text")
.attr("class","path-text")
.text(function(d) { return d.data.label; });
svg 变量在顶级闭包中声明一次,如下所示:
var svg = d3.select("body").append("svg:svg")
.attr("viewBox", "0 0 " + width + " " + height)
.attr("preserveAspectRatio", "xMidYMid meet");
我的图表有一个 tick() 函数,它计算每个标签的位置,如下所示:
function tick()
{
// Line label
path_text.attr("transform", function(d)
{
var dx = (d.target.x - d.source.x),
dy = (d.target.y - d.source.y);
var dr = Math.sqrt(dx * dx + dy * dy);
var sinus = dy/dr;
var cosinus = dx/dr;
var l = d.data.label.length * 6;
var offset = (1 - (l / dr )) / 2;
var x=(d.source.x + dx*offset);
var y=(d.source.y + dy*offset);
return "translate(" + x + "," + y + ") matrix("+cosinus+", "+sinus+",
"+-sinus+", "+cosinus+", 0 , 0)";
});
.
.
.
我尝试将这个 svg 声明向下移动到更新函数中,以便每次发生图形更改时都会对其进行实例化。这实际上有效 - 但它会完全复制整个图表。第一个,原始副本仍然保留旧标签 - 但第二个副本完全按照我的意愿行事。有没有办法,也许,而不是附加 svg,有一种替换的方法?我也尝试过调用 exit().remove() 也没有任何运气。
非常感谢您的参与。这一直让我感到沮丧,因为我应该如何做到这一点。