我一直在努力解决与 D3 中的过渡有关的问题。考虑这段代码:
svg.selectAll("path")
.data(data, key)
.enter().append("path")
.attr("d", someFunctionThatReturnsAPath);
});
setTimeout
几秒钟后,我会调用以下命令:
svg.selectAll("path")
.transition()
.duration(2000)
.attr("d", someFunctionThatReturnsADifferentPath);
});
第二个调用正确地更新了路径,但没有为过渡设置动画。d
为什么在第二次调用中更新属性时没有转换?
请注意,路径非常复杂。在这两个调用中,在实际绘制路径之前都有明显的延迟。也许这与缺乏过渡有关?
我是 D3 的新手,但我已经阅读了转换,似乎无法理解为什么它的行为不像我预期的那样。
更新
根据@Marjancek 的回答,我将提供有关这两个被调用函数的更多详细信息。
这是 的定义someFunctionThatReturnsAPath
:
function(d) {
var coordinates = [];
for (var i = d.track.length - 1; i >= 0; i--) {
// We only care about the last 10 elements
if (coordinates.length >= 10)
break;
coordinates.push(d.track[i]);
}
return path({type: "LineString", coordinates: coordinates});
};
并且someFunctionThatReturnsADifferentPath
:
function(d) {
var coordinates = [];
for (var i = d.track.length - 1; i >= 0; i--) {
// We only care about the last 20 elements
if (coordinates.length >= 20)
break;
coordinates.push(d.track[i]);
}
return path({type: "LineString", coordinates: coordinates});
};
其中路径定义如下(projection
is d3.geo.albersUsa()
):
var path = d3.geo.path()
.projection(projection);
目标是在第二次调用时,这条线用 10 个更新的数据点进行扩展。