3

我有一个由我试图根据用户输入更新的区域、线条和圆圈组成的图表,我已经开始工作了,但是当从较低的数据量转换到较高的数据量时,比如从[4,2,3,4,5][2,4,3,1,5,8,6],线条动画他们当前的路径到他们的新位置,但是偏移量只是被捕捉到位,对于添加到路径的任何新值都没有动画。

我想要它做的是从当前线路径到新线路径的动画,平滑过渡,以便新值不会只是卡入到位,无论数据数量如何。

另外,在旁注中,图形宽度在更新时不断变化,我希望它延伸到 svg 的整个宽度,无论存在多少数据,我怎么能做到这一点?

这是我迄今为止所拥有的小提琴http://jsfiddle.net/znmBy/

我希望我足够清楚,我是 D3 的新手,所以我对术语有点不确定。

4

1 回答 1

2

您描述的问题有点复杂,因为在 D3 中您首先必须在固定位置添加一个对象,然后您可以将其从原始位置设置为动画到另一个位置。

在您的示例中,我将根据先前的值计算新的(中间)初始位置,然后使用实际的最终值再次更新图表。这将创建一个从开始到最终位置的漂亮路径动画:

    updateGraph([
            [...].concat(computeLatestIntermediates()),
            [...].concat(getLatestTimes())
          ]);

    updateGraph([
            [...].concat(getRealValues()),
            [...].concat(getLatestTimes())
          ]);

或者,您可以将初始值设置为0。这将创建一个从底部到目标值的漂亮动画:

    updateGraph([
            [..., 0, 0, 0, 0],
            [...,10,12,13,14]
          ]);

    updateGraph([
            [..., 234, 245, 210, 170],
            [...,  10,  12,  13,  14]
          ]);

顺便说一句:为折线图制作动画时,您通常还会遇到其他几个问题。其中一些包含在 Mike 的路径动画页面上这里还有一个相关的问题。

编辑(更智能的解决方案):

您可以在绘图函数中实现这个两步绘图,而不是调用两次更新函数,如下所示:

function getPathData(d,i)        { return "M 0,0 ... L n,n"; }
function getInitalTransform(d,i) { return "translate(...)";  }
function getFinalTransform(d,i)  { return "translate(...)";  }

path
    .attr("d", getPathData)
    .attr("transform", getInitalTransform)
  .transition()
    .ease("linear")
    .attr("transform", getFinalTransform);
于 2012-12-06T16:29:45.277 回答