javascript - d3.behavior.zoom() 将图形移动到 Angular 落而不是中心

标签 javascript d3.js graph sunburst-diagram

我想为我的旭日添加鼠标滚轮缩放:
我所做的是编辑这段代码:

var zoom = d3.behavior.zoom()
    .scaleExtent([1, 10])
    .on("zoom", zoomed);

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
    .append("g")
    .attr("transform", "translate(" + width/2 + "," + height * .52 + ")")
    .call(zoom);

function zoomed() {
  svg.attr('transform', 'translate(' + d3.event.transform.x + ',' + d3.event.transform.y + ') scale(' + d3.event.scale + ')');
  //svg.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
}

问题是,当页面加载时,一切似乎都正常,但是当使用鼠标轮滚动时,旭日最终出现在左上角:
enter image description here

我能够通过更改此代码来解决此问题:

function zoomed() {
  svg.attr("transform", "translate(" + width/2 + "," + height * .52 + ")scale(" + d3.event.scale + ")");
}

旭日现在停留在中间,但是这不会缩放到光标所在的位置,也不允许用户进一步缩小。
有什么建议我可以缩放到光标位置(如第一个代码示例中所示)而不会使左上角的旭日消失?

完整代码请参见JSfiddle ,它在这里不起作用,但是在本地运行它确实可以工作。

最佳答案

d3.event.translate 返回一个数组。因此,如果您想添加这些值(width/2height/2),则必须单独添加它们:

function zoomed() {
    svg.attr('transform', 'translate(' + (d3.event.translate[0] + width / 2) +
        ',' + (d3.event.translate[1] + height / 2) + ') scale(' + d3.event.scale + ')');
}

或者,如果您想使用原始的缩放功能...

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

...只需中断 svg 选择,为该组指定另一个名称:

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height);

var foo = svg.append("g")
    .attr("transform", "translate(" + width / 2 + "," + height * .52 + ")")
    .call(zoom);

关于javascript - d3.behavior.zoom() 将图形移动到 Angular 落而不是中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44485404/

相关文章:

javascript - 根据使用ajax选择的值填充多个字段

javascript - d3 嵌套数据 - 单独的图 - 设置 y.domain?

algorithm - 寻找具有最大最小度数的生成树

algorithm - 具有断开图的 Kruskal 算法

c# - msdn C# 图形示例中的无效参数错误

javascript - Chartjs 饼图每个部分的随机颜色,数据来自数据库动态

javascript - 三元运算符的赋值忽略剩余的表达式

javascript - 如何使用 Apollo 在 Nuxt 生成的动态页面中正确填充页面标题?

javascript - 弧线内的折线图

d3.js - 关于可重用图表的一些说明