【问题标题】:How to zoom a chart in d3 correctly?如何正确放大 d3 中的图表?
【发布时间】:2016-05-31 22:30:14
【问题描述】:

我正在尝试将缩放添加到 d3 中的折线图。

var zoom = d3.behavior.zoom()
   .x(xScale)
   .y(yScale)
   .scaleExtent([1, 10])
   .on("zoom", zoomed);
element.call(zoom);

function zoomed() {
   element.attr("transform", "scale(" + d3.event.scale + ")")
    .select(".x.d3-axis").attr('transform', 'translate(0,' + height + ')').call(xAxis)
     .select(".y.d3-axis").attr('transform', 'translate(0,0)').call(yAxis);
    };

jsFiddle

但是,每次缩放图表时,它都会向左移动。完成缩放操作后,我似乎找不到将其恢复到原始位置的方法。

我该如何解决这个问题?

【问题讨论】:

    标签: javascript d3.js plot zooming


    【解决方案1】:

    除了缩放元素之外,您还必须翻译元素。现在,您的缩放功能缩放element

    通过将转换更改为包含d3.event.translate,您将获得所需的行为。

    function zoomed() {
      element
      .attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")")
    
      ...
    }
    

    这是您的 fiddle 以及更新后的代码。


    更新

    要摆脱奇怪的偏移,只需将您的边距添加到 d3.event.translate 值:

    var translate = [d3.event.translate[0] + margin.left, d3.event.translate[1] + margin.top];
    
    element
          .attr("transform", "translate(" + translate + ")scale(" + d3.event.scale + ")")
    

    fiddle

    此外,如果您想确保 SVG 只停留在原始边界内(没有溢出),您应该查看SVG clipPath element

    【讨论】:

    • 感谢您的解决方案。但是,您发布的小提琴并不能完全解决这个问题。每次放大缩小它都会向左移动一点。是因为margin吗?
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 2021-11-04
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多