bl.ocks 网站上的饼图更新示例不会“就地”更新元素:
http://bl.ocks.org/j0hnsmith/5591116
function change() {
clearTimeout(timeout);
path = path.data(pie(dataset[this.value])); // update the data
// set the start and end angles to Math.PI * 2 so we can transition
// anticlockwise to the actual values later
path.enter().append("path")
.attr("fill", function (d, i) {
return color(i);
})
.attr("d", arc(enterAntiClockwise))
.each(function (d) {
this._current = {
data: d.data,
value: d.value,
startAngle: enterAntiClockwise.startAngle,
endAngle: enterAntiClockwise.endAngle
};
}); // store the initial values
path.exit()
.transition()
.duration(750)
.attrTween('d', arcTweenOut)
.remove() // now remove the exiting arcs
path.transition().duration(750).attrTween("d", arcTween); // redraw the arcs
}
相反,它只是将新的值数组视为全新的数据,并相应地调整图表的大小。
我创建了一个小提琴非常简单地演示了这个问题:
如果您按“添加”,它会向数组添加一个随机整数:这按预期工作。
如果您按“删除”,则唯一被转换出的元素始终是最后一个进入饼图的元素。简而言之,它的行为类似于 LIFO 堆栈。预期的行为是让相关的饼弧转出。
是否可以将对象一致性应用于馅饼?我也尝试过添加一个关键功能(未在小提琴上演示),但这只是中断(奇怪的是它适用于我的堆叠图)。
谢谢你。