javascript - 如何正确缩放 d3 中的图表?

标签 javascript d3.js plot zooming

我正在尝试向 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

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

我该如何解决这个问题?

最佳答案

除了缩放元素之外,您还必须平移元素。现在,您的缩放功能缩放元素

通过更改转换以包含 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 .

关于javascript - 如何正确缩放 d3 中的图表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37556692/

相关文章:

r - 堆积面积图未正确显示负值

javascript - jquery datepicker onclose 事件未触发

r - 如何将箱线图添加到带有抖动的散点图

python - 如何获取两个列表中对应的值

javascript - D3.js 鼠标悬停和焦点 + 上下文问题

javascript - 将 d3.js SVG 移植到 HTML5 Canvas?

javascript - 为什么会出现水平条?

javascript - 如何限制 FineUploader 接受拖放目录?

javascript - 数据表大小变化

javascript - 以非阻塞方式更新 HTML Canvas