D3.js d3拖动-在d3v5中使用拖动重新缩放y轴

D3.js d3拖动-在d3v5中使用拖动重新缩放y轴,d3.js,d3fc,D3.js,D3fc,当用户沿轴拖动时,我试图实现重新缩放d3fc笛卡尔图表的效果 这是在d3v5中,我使用d3缩放来使用d3.event.transform重新缩放轴。然而,在d3拖动中没有d3.event.transform,因此我不明白仅使用d3拖动提供的鼠标坐标的等效逻辑是什么 const zoom = d3.zoom() .on('zoom', () => { const t = d3.event.transform; x.domain(t.rescaleX(x2).

当用户沿轴拖动时,我试图实现重新缩放d3fc笛卡尔图表的效果

这是在d3v5中,我使用d3缩放来使用d3.event.transform重新缩放轴。然而,在d3拖动中没有d3.event.transform,因此我不明白仅使用d3拖动提供的鼠标坐标的等效逻辑是什么

const zoom = d3.zoom()
   .on('zoom', () => {
       const t = d3.event.transform;
       x.domain(t.rescaleX(x2).domain());
       y.domain(t.rescaleY(y2).domain());
       render();
   });

plot.call(zoom);

//What is the equivelant drag action to rescale?
const yAxisDrag = d3.drag()                 
    .on('end', (args) => {
       var t = d3.zoomTransform(plot.node());

       //zoom.translateBy(plot,d3.event.dx/t.k,d3.event.dy/t.k);
       //How can I use zoom.scaleBy() here instead?
    });

您可以创建另一个仅更改Y域的缩放行为。然后,在拖动处理程序中,使用基于拖动事件的增量Y的比例因子在绘图区域上调用新行为的scaleBy:

常数yAxisZoom=d3.zoom .在“缩放”上,=>{ y、 domaind3.event.transform.rescaley2.domain; 提供 }; 常数yAxisDrag=d3.drag .在“拖动”上,=>{ 常数因子=Math.pow2,-d3.event.dy*0.01; d3.选择“缩放图表.绘图区域”.callyAxisZoom.scaleBy,因子; };
您是否考虑过只在轴上添加缩放侦听器,或者在轴上添加缩放侦听器,而不仅仅是提供传统缩放事件魔咒的绘图?这会实现什么?拖动时缩放行为会平移。这就是现在删除的答案中建议的代码的d3拖动等价物:d3.drag.ondrag,=>{const t=d3.zoomtransferormplot.node;zoom.translateByplot,d3.event.dx/t.k,d3.event.dy/t.k;};相反,我需要在拖动时缩放。d3拖动似乎是正确的使用方法,我认为除了使用scaleBy方法外,它与上面的代码类似。我只是不理解将x/y点转换为轴重缩放的逻辑。为了澄清,我想要的行为可以在TradingView.comok上的任何图表上看到,如果您需要拖动而不是鼠标滚轮或其他什么,那么这就解决了问题。要将x/y变换为新比例,可以使用。将x或y范围(即像素值)传递到原始比例上反转,它返回域值,然后可以传递给重缩放函数。什么重缩放函数?我只看到一个rescaleX和rescaleY,它采用一个比例,而不是一个域作为参数。你能演示一下你在提供的代码笔中的意思吗?我想了很多。我想你会在拖动端取x或y的位置,然后用它来计算比例,但你可能知道,需要一个临时步骤来确定按什么来缩放。这让我想到,您可以通过编程方式从drag end处理程序调用zoom,或者使用scaleBy值来确定缩放因子。OTOH,在轴上使用刷子是可行的选择吗?有无数的例子。如果不直接使用刷子,可能刷子源可以照亮解决方案?