svg 上的圆圈无法使用 D3 javascript 库正确补间

Circles on svg wont tween correctly using D3 javascript library

我目前正在使用 D3 库创建圆环图。当按下按钮时,图表有两种状态,您可以在两种状态之间进行补间。按下按钮时,饼图切片、折线和文本标签都正确地围绕图表补间。但是,当我按下按钮时,我的某些圆圈无法正确补间。圆圈保留在原位,但会在变换的结束位置绘制新圆圈。

我有一个 jsfiddle 显示了这里的行为:http://jsfiddle.net/Qh9X5/7847/

控制圆圈的相关代码具体在这里:

        /* ------- OUTER POINTS -------*/


        var outerPoint = fndAfter.select(".outerPoints").selectAll(".outerPoint")
           .data(pie(data), key);

        outerPoint.enter()
            .append("circle")
            .attr("r", "2");

        outerPoint.transition().duration(1000)
            .attrTween("transform", function (d) {
                this._current = this._current || d;
                var interpolate = d3.interpolate(this._current, d);
                this._current = interpolate(0);
                return function (t) {

                    var d2 = interpolate(t);
                    var pos = outerArc.centroid(d2);
                    pos[0] = radius * 0.624 * (midAngle(d2) < Math.PI ? 1 : -1);
                    return "translate(" + pos + ")";
                };
            });

        outerPoint.exit()
            .remove();

        /* ------- INNER POINTS -------*/

        var innerPoint = fndAfter.select(".innerPoints").selectAll(".innerPoint")
           .data(pie(data), key);

        innerPoint.enter()
            .append("circle")
            .attr("r", "2");

        innerPoint.transition().duration(1000)
            .attrTween("transform", function (d) {
                this._current = this._current || d;
                var interpolate = d3.interpolate(this._current, d);
                this._current = interpolate(0);
                return function (t) {
                    var d2 = interpolate(t);
                    var pos = outerArc.centroid(d2);
                    pos[0] = radius * 0.624 * (midAngle(d2) < Math.PI ? 1 : -1);
                    return "translate(" + midPoint(midPoint(arc.centroid(d2), outerArc.centroid(d2)), outerArc.centroid(d2)) + ")";
                };
            });

        innerPoint.exit()
            .remove();

我的印象是 attrTween 应该对所有转换函数都一样工作,无论它是什么元素。

问题不在于 attrTween。您使用 selectAll('.innerPoint') 来定义您的选择,但您从未将 innerPoint class 应用于圆圈,因此 d3 永远不会找到任何匹配的选择并每次都附加新的圆圈。

工作fiddle:http://jsfiddle.net/Qh9X5/7849/