我正在使用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