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 Yes
zoom
行为可以添加到任何元素,但通常与
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