我正在使用d3.js v4
。我目前正在實施程序化縮放。這Panning and Zooming Tutorial已經非常有幫助。我的縮放與滾動輪一起工作,但我想創建按鈕進行縮放。我知道縮放和平移有什麼必要,是翻譯[tx, ty]
和比例因子k
。我正在爲我的X軸使用時間刻度。我設法得到tx
和比例因子k
,在x軸上獲得p1 (point 1)
和p2(point 2)
的像素值,然後使用這些值得到k(比例因子)。喜歡這樣:W/Programmatic Zoom v4
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:
var tx = 0 - k * p1;
然後饋入一個d3.zoomIdentity()
和重新調整我的xdomain。我創建了一個縮小的按鈕。問題是當我放大,然後嘗試使用按鈕縮小,它縮小,但收縮的X軸。我似乎無法找出爲什麼它縮小了X軸,而不是正確縮小。
我的jsfiddle
https://jsfiddle.net/codekhalifah/Lmdfrho7/2/
我已經試過
- 讀變焦Documentation
- 通過對變焦章節閱讀D3.js in action
我的代碼
後滾輪縮放應用運行此功能:
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
@Hamms嗯,我想實際上能夠放大到不同的級別。這只是我的第一個測試級別。但在Timescale上,我想從幾個月的視圖縮放到周視圖,一天縮小到15分鐘。我的第一個測試級別是回到看到幾個月。 – inspired
@Hamms有什麼想法? – inspired