1

新しいバージョンのライブラリd3(3.0.3)では解決策が機能しないため、この質問をもう一度変更してください。もう一度助けを求めるようになりました。非常にありがたいです。

ライブラリd3(3.0.3)の新しいコードは次のとおりです。

https://gist.github.com/4495104 http://bl.ocks.org/4495104/e7a7589098140dff36df7ab2a824d71072bc3be4

私が取り組んだことによると、エラーは「491」行にあるはずです。

// Reset the domain relative to the current zoom offsets.
    x.domain(x0.range().map(function(x) {
      return (x - translate[0]) / scale; 
    }).map(x0.invert));

x.domain背景が動いているように見せたいので、毎秒をで変更していますが、イベント(ズームまたはパン)setIntervalを実行するたびに、自動的に初期値に切り替わります。次のリンクで、問題を確認できます。d3.behavior.zoom()x.domain

http://jsfiddle.net/cristian540/Uy6bW/11/

4

1 に答える 1

2

プログラムでスケールのドメインを変更する場合は、スケールをズーム動作に再割り当てする必要があります。これは、ズーム動作がスケールのクローンを内部に保存して、新しいスケールの新しいドメインを計算し、オフセットを変換するためです。したがって、スケールを再割り当てしない場合は、(古い)複製されたスケールが引き続き使用されます。

これに関するメモを含めるようにドキュメントを更新しました。

さらに複雑な点があります。これは、ズームのxスケールとyスケールがズームスケール=1のドメインを表す必要があることです。したがって、実際には、現在のスケールの独自のクローンをzoom scale = 1に保持し、クローンと現在のスケールの両方にオフセットを適用する必要があります。

次に、必要な正確な動作に応じて、現在のズームの移動と拡大縮小を反転する必要がある場合もあります。

したがって、次のようになります。

var x0 = d3.scale.linear().domain(…).range(…), // initial scale
    x = x0.copy(); // copy to use for axes and zoom behaviour

setInterval(function() {
  var translate = zoom.translate(),
      scale = zoom.scale(),
      xd = x0.domain(),
      dx = 1;

  // Set a new x-domain: offset by dx.
  x0.domain([xd[0] += dx, xd[1] += dx]);

  // Set the zoom x-domain (this resets the domain at zoom scale=1).
  zoom.x(x.domain(xd));

  // Reset the domain relative to the current zoom offsets.
  x.domain(x0.range().map(function(x) {
    return (x - translate[0]) / scale;
  }).map(x0.invert));
}, 1e3);

動作中のこの例

于 2012-09-15T22:44:29.220 に答える