d3js很好地添加了过渡点

yam*_*ade 5 d3.js

假设我path 创建了d3一个类似以下内容的内容:

line = d3.line()
    .curve(d3.curveLinear)
    .x(function(d) { return x(d.x);})
    .y(function(d) { return y(d.y); });

data = [{x: 0, y: 0}, {x: 5, y: 5}, {x:10, y:10}];

myLine = svg.append("path")
        .attr("fill", "none")
        .attr("stroke", "steelblue")
        .datum(data)
        .attr("d", line);
Run Code Online (Sandbox Code Playgroud)

这会在0到10之间形成一条对角线。现在,如果我更新数据进行一些更改并添加一些点:

data = [{x: 1, y: 1}, {x:2, y:3}, {x: 6, y: 7}, {x:9, y:9}];
Run Code Online (Sandbox Code Playgroud)

并更新我的行

myLine.datum(data).transition().duration(1000).attr("d", line);
Run Code Online (Sandbox Code Playgroud)

它提供了一个怪异的过渡,它将现有路径滑动到适合新路径的前三个点,并笨拙地将最后一点添加到末尾。

类似地,如果我更新它以减少点,它会缩短线,然后将剩余部分滑移,而不是仅仅重塑它的位置。

我知道为什么会这样,但是我想知道是否有一种方法可以创建更平滑的过渡。

Tim*_*m B 4

你应该看看这个页面和这个github

.attrTween('d', function () { 
    return d3.interpolatePath(line(data), line(data2)); 
});
Run Code Online (Sandbox Code Playgroud)

看看这个小提琴