Javascript d3js:当有两个y轴时缩放
参考:Javascript d3js:当有两个y轴时缩放,javascript,d3.js,Javascript,D3.js,参考: d3.behavior.zoom()支持x轴和y轴的自动缩放。但是,我必须同时缩放两个y轴。当zoom()被触发时,我可以从d3.event.scale和d3.event.translate中获取当前的scale和translate信息,但我不知道如何使用它们为第二个y轴(y2)进行适当的缩放 我也在看 由于y1的范围是通过zoom自动调整的,如果有办法获取y1的当前范围,我可以获取其最小值和最大值,并根据它们设置y2的范围。但是,对于给定的scale对象,文档没有指定获取range的方
d3.behavior.zoom()
支持x轴和y轴的自动缩放。但是,我必须同时缩放两个y轴。当zoom()被触发时,我可以从d3.event.scale
和d3.event.translate
中获取当前的scale
和translate
信息,但我不知道如何使用它们为第二个y轴(y2
)进行适当的缩放
我也在看
由于y1
的范围是通过zoom
自动调整的,如果有办法获取y1
的当前范围,我可以获取其最小值和最大值,并根据它们设置y2
的范围。但是,对于给定的scale
对象,文档没有指定获取range
的方法。调用y1.range()
(不带任何参数)将返回标尺的[min,max]
从:
如果未指定值,则返回刻度的当前输出范围
D3中的大多数访问器函数都是这样工作的,如果您不使用任何参数调用它们,它们会返回(获取)值;如果您使用参数调用它们,它们会设置值,并返回this
对象以便于链接:
d3Object.propertyName=函数(\ux){
如果(!arguments.length)返回propertyName;
propertyName=389;;
归还这个;
}
但是,缩放
行为会改变域
,而不是秤的范围
从:
指定缩放时应自动调整其域的x比例
因此,您不需要获取/设置
范围
,而是缩放功能已管理所有比率的y1
和y2
:y2.domain(y1.domain())
,因此更简短的答案是:
var zoomFirst = d3.behavior.zoom()
.x(x)
.y(y1)
.scaleExtent([0, 3])
.size([w, h])
.on("zoom", function() {
zoomSecond.scale(zoom.scale());
zoomSecond.translate(zoom.translate());
// Update visual. Both y domains will now be updated
});
// Create copy for y2 scale
var zoomSecond = d3.behavior.zoom()
.x(x)
.y(y2) // <-- second scale
.scaleExtent([0, 3]) // <-- extent
var zoomFirst=d3.behavior.zoom()
.x(x)
.y(y1)
.scaleExtent([0,3])
.尺寸([w,h])
.on(“缩放”,函数(){
zoomSecond.scale(zoom.scale());
zoomSecond.translate(zoom.translate());
//更新视觉。现在将更新两个y域
});
//为y2比例创建副本
var zoomSecond=d3.behavior.zoom()
.x(x)
.y(y2)//谢谢!这可能是一个开始。我需要得到y1的当前范围,该范围通过缩放进行调整。有没有一种方法可以执行类似于zoom.y.range()
?@MaximusS是的,zoom.y().range()
但是我已经进一步更新了答案。太好了!非常感谢:)@MaximusS在这种情况下,我怀疑缩放数据可能是一件更好的事情,以便使缩放比例相同。但是,您的解决方案也会起作用。@MaximusS Yeszoom
行为可以添加到任何元素,但通常与g
和svg
一起使用,因为它们包含其他元素并设置自己的坐标系。平移/缩放它们将平移/缩放内部元素。您应该将所有元素放在g
中,并对其应用zoom
行为。
var zoomFirst = d3.behavior.zoom()
.x(x)
.y(y1)
.scaleExtent([0, 3])
.size([w, h])
.on("zoom", function() {
zoomSecond.scale(zoom.scale());
zoomSecond.translate(zoom.translate());
// Update visual. Both y domains will now be updated
});
// Create copy for y2 scale
var zoomSecond = d3.behavior.zoom()
.x(x)
.y(y2) // <-- second scale
.scaleExtent([0, 3]) // <-- extent