【问题标题】:D3.js Donut transitionD3.js 甜甜圈过渡
【发布时间】:2015-04-15 13:40:52
【问题描述】:

我正在开发一个 d3 甜甜圈,但我一直在思考如何更新甜甜圈值,例如,如果您将值从 42 更改为 17,则值将回流。 我可以删除 svg,但它会从零位置重写新值 (17)。

我希望它从 42 倒流到 17。

var path = svg.selectAll("path")
        .data(pie(dataset.lower))
        .enter().append("path")
        .attr("class", function(d, i) { return "color" + i })
        .attr("d", arc)
        .each(function(d) { this._current = d; }); // store the initial values

这是我的 jsfidle 的链接http://jsfiddle.net/yr595n96/

我希望您能提供任何帮助。

谢谢

【问题讨论】:

  • 您的“下一步”按钮单击没有执行/调用任何操作? :/ 你想让它做什么?
  • 根据其中的评论,我希望能够将甜甜圈的值从 42 更改为 17,但甜甜圈的红色部分应该流回(过渡)的值17. 我希望这很清楚。感谢观看
  • 啊,我明白了,当再次这样调用它时:jsfiddle.net/yr595n96/1,它会创建一个新的“甜甜圈”。您必须在绘制弧线的代码中调用您的点击,我看看:)
  • 没错,我就是这么做的。如果我使用 remove() 函数,它工作正常,但红色消失并再次从 0 开始。如果可能的话,我希望它从 42 回到 17。谢谢
  • 是的,我明白了,两者之间的过渡而不删除任何东西......

标签: d3.js transition updates donut-chart


【解决方案1】:

这是你的新按钮点击:

$("#next").click(function () {
    percent = 17;
    var progress = 0;
    var timeout = setTimeout(function () {
        clearTimeout(timeout);
        var randNumber = Math.random() * (100 - 0 + 1) + 0;
        //path = path.data(pie(calcPercent(17))); // update the data << change this
        path = path.data(pie(calcPercent(randNumber)));
        path.transition().duration(duration).attrTween("d", function (a) {
            // Store the displayed angles in _current.
            // Then, interpolate from _current to the new angles.
            // During the transition, _current is updated in-place by d3.interpolate.
            var i  = d3.interpolate(this._current, a);
            var i2 = d3.interpolate(progress, randNumber)
            this._current = i(0);
            return function(t) {
                text.text( format(i2(t) / 100) );
                return arc(i(t));
            };
        }); // redraw the arcs
    }, 100);
});

第 8 行通知:

path = path.data(pie(calcPercent(randNumber)));

您需要传递新数据才能过渡到。我在这里使用了一个随机数,只是为了向您展示任何数字的作品。我为此创建了一个变量并将其传递给“路径”和文本:“i2”> d3.interpolate。

您可以随时将其更改为 17 以满足您的要求:)

更新小提琴:http://jsfiddle.net/yr595n96/3/

【讨论】:

  • 请注意文本再次从 0 开始,而不是从最后一个值开始。您可以在 'var i2 = d3.interpolate(progress, randNumber)' 中更改它,只需将 'progress' 更改为当前值。可能必须创建一个布尔值来检查它是否是您第一次单击。如果是从 0 开始,如果不是从最后一个数字开始 :)
  • 这正是我想要的。非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
相关资源
最近更新 更多