私はd3.js v4
を使用しています。現在、プログラムによるズームを実装しています。このPanning and Zooming Tutorialはすごく助けになりました。ズームはホイールをスクロールしても機能しますが、ズームするボタンを作成したいと思います。私はズームとパンに必要なものが、翻訳[tx, ty]
とスケールファクタk
であることを知っています。私はx軸にタイムスケールを使用しています。私は、x軸にp1 (point 1)
とp2(point 2)
のピクセル値を得て、次にそれらの値を使ってk(スケールファクタ)を得ることによって、tx
とスケールファクタk
を得ました。こうした同様:問題(プログラマチックズームv4)
var tx = 0 - k * p1;
が続いd3.zoomIdentity()
にそれを送り、私のxdomainを再スケーリング:
var k = 500/(xScale(p2) - xScale(p1)); //500 is desired pixel diff. between p1 and p2, and xScale is my d3.scaleTime() accessor function.
// for this zoom i just want the first value and last value to be at scale difference of the entire width.
その後、私はこれでTXを計算します。ズームアウトするためのボタンを作成しました。問題は、ズームインしてズームアウトするときにボタンを使用しようとするときです。ズームアウトすると、x軸は縮小されます。私はなぜそれがx軸を縮小するのか、正確に戻ってズームするのを見つけることができません。
マイJSFiddle
https://jsfiddle.net/codekhalifah/Lmdfrho7/2/
私が試した何
012にズームの章を読みますマイコード
ホイールズームが、私はこの機能を実行に適用された後:
function zoomed() {
if (d3.event.sourceEvent && d3.event.sourceEvent.type === "brush") return; // ignore zoom-by-brush
var t = d3.event.transform;
console.log(t);
console.log(xScale.domain());
xScale.domain(t.rescaleX(x2).domain());
usageAreaPath.attr("d", area);
usageLinePath.attr('d',line);
weatherAreaPath.attr('d',weatherChart.area);
focus.select(".axis--x").call(xAxis);
focus.selectAll('.circle')
.attr('cx', function(d) { return xScale(getDate(d)); })
.attr('cy', function(d) { return yScale(d.kWh); })
.attr("transform", "translate(0," + 80 + ")");
... other non related items
}
ズームが正常に動作しますが、私が欲しい通常の位置にピンを見るにはズームインしようとすると、手動で、その後にズームや後。私が今しながら、少しのためにこれを見てきた、と私はそれを作業のソートを得た
function programmaticZoom(){
var currDataSet = usageLinePath.data()[0], //current data set
currDataSetLength = currDataSet.length,//current data set length
x1 = currDataSet[0].usageTime, //getting first data item
x2 = currDataSet[currDataSetLength-1].usageTime, //2nd data item
x1px = xScale(moment(x1)), //Get current point 1
x2px = xScale(moment(x2)); // Get current point 2
// calculate scale factor
var k = width/(x2px - x1px); // get scale factor
var tx = 0 - k * x1px; // get tx
var t = d3.zoomIdentity.translate(tx).scale(k); //create zoom identity
xScale.domain(t.rescaleX(window.x2).domain());
usageAreaPath.attr("d", area);
usageLinePath.attr('d',line);
weatherAreaPath.attr('d',weatherChart.area);
focus.select(".axis--x").call(xAxis);
focus.selectAll('.circle')
.attr('cx', function(d) { return xScale(getDate(d)); })
.attr('cy', function(d) { return yScale(d.kWh); })
.attr("transform", "translate(0," + 80 + ")");
}
ズームボタンを常にデフォルトの初期表示にズームするだけですか? – Hamms
@ハムス私は実際にさまざまなレベルにズームすることができるようにしたい。これは私の最初のテストレベルでした。しかし、タイムスケールでは、月間ビューから週ビュー、1日から1時間、15分まで拡大したいと考えています。私の最初のテストレベルは、数ヶ月を見に戻ったことでした。 – inspired
@ハムどんなアイデア? – inspired