オブジェクトに最小から最大に変換するように指示すると、オブジェクトはこれら2つの値のみを尊重し、あなたが言ったように、その間の面白いジャンプをスキップします。
現在、すべてのデータをプッシュしてチャートを1回描画していると思います。代わりに、データをグラフに段階的にプッシュすることができます。
var data = [{id: o1, v: []}, {id: o2, v: []}]; // values for 2 objects
function getTransform(d) {
return "translate(" + d.v[d.v.length-1] + ")";
}
function update() {
var elems = d3.selectAll(...).data(data, function(d) {return d.id;})
elems.enter()
.append(...) //append DOM/SVG objects and
.attr(...) //initalize their start values and
.attr("transform", getTransform ) //their start animation values
// animate the existing elements to move to their new values
elems.transition().attr("transform", getTransform )
}
function play(){
// pushing in "crazy" values
data[0].v.push( Math.random()*10 );
data[1].v.push( Math.random()*10 );
update();
}
setTimeout(play, 500)
setTimeout(play, 1000)
setTimeout(play, 1500)
基本的な考え方は、d3ですべてのデータを一度にスローするのではなく、アニメーション化する順序と適時性でデータを追加することです。
さらに、または代わりに、時間インデックスを設定し、それをgetTransform
関数で使用して、任意の状態にアニメーション化することもできます。これを段階的に行うと、アニメーションで「クレイジー」な値を使用するようになります。
var time = 0;
var maxTime = 2;
function getTransform(d) {
return "translate(" + d.v[time] + ")";
}
function next(){
update();
if(time++ < maxTime) setTimeout(next, 500)
}
play(); play(); play(); // add some data ;)
next() // start index based playback from `time` to `maxTime`
アニメーションをクレイジーなスパイクにヒットさせるには、タイムアウト値500
を目的のアニメーション速度に一致させる必要がある場合があります。duration(..)
そうしないと、d3がアニメーションパスをスムーズにする可能性があります(アニメーションよりも速く更新する場合)。