D3.js D3js多段线轴缩放图表

D3.js D3js多段线轴缩放图表,d3.js,D3.js,我正在尝试创建一个具有多段线x轴的可缩放图表。如果I没有多段线轴,则一切正常。但是,当使用多段线轴时,平移(和缩放)非常扭曲。如果拖动图表进行平移,将看到点和x轴扭曲。该示例使用默认的D3js缩放行为。如有任何关于平滑平移/缩放的建议,将不胜感激 我使用转换来定位元素,因为我在指定cx和cy值时遇到了一些问题(特别是在向平移或缩放图表添加新数据时) 以下是缩放功能: var onZoom = function () { if (d3.event.scale ==

我正在尝试创建一个具有多段线x轴的可缩放图表。如果I没有多段线轴,则一切正常。但是,当使用多段线轴时,平移(和缩放)非常扭曲。如果拖动图表进行平移,将看到点和x轴扭曲。该示例使用默认的D3js缩放行为。如有任何关于平滑平移/缩放的建议,将不胜感激

我使用转换来定位元素,因为我在指定cx和cy值时遇到了一些问题(特别是在向平移或缩放图表添加新数据时)

以下是缩放功能:

var onZoom = function () {
                if (d3.event.scale == 1) {  //panning

                } else {   //zooming
                    // don't scale points and lines
                    graph.selectAll(".point")
                        .attr("r", 10 / d3.event.scale)
                        .attr("stroke-width", 1 / d3.event.scale);
                }

    graph.selectAll(".point")
        .attr("transform", function (d) { return "translate(" + xMap(d) + "," + yMap(d) + ")scale(" +     d3.event.scale + ")"; });

    graph.select(".xAxis.axis").call(xAxis);
    graph.select(".yAxis.axis").call(yAxis);
};

请参见示例:

我了解了如何在不失真的情况下平移/缩放多段线轴

我在阅读这个问题的公认答案时发现了这一点:“d3缩放行为对象通过更改其域来修改缩放。您可以通过更改缩放范围来获得类似效果,因为重要的部分是更改域和范围之间的关系。”

因此,我修改了缩放行为以不更新x域,并更新缩放行为中的范围:

  // update range in zoom event - leave the domain as is
    x.range(d3.range(xTicks.length)
        .map(function (d) { return (d * xRangeDelta) * d3.event.scale + d3.event.translate[0]; }))

    graph.selectAll(".point")
        .attr("transform", function (d) { return "translate(" + xMap(d) + "," + yMap(d) + ")scale(" + d3.event.scale + ")"; });

    graph.select(".xAxis.axis").call(xAxis);
    graph.select(".yAxis.axis").call(yAxis);

这是一个更新的提琴:。

我发现了如何在不失真的情况下平移/缩放多段线轴

我在阅读这个问题的公认答案时发现了这一点:“d3缩放行为对象通过更改其域来修改缩放。您可以通过更改缩放范围来获得类似效果,因为重要的部分是更改域和范围之间的关系。”

因此,我修改了缩放行为以不更新x域,并更新缩放行为中的范围:

  // update range in zoom event - leave the domain as is
    x.range(d3.range(xTicks.length)
        .map(function (d) { return (d * xRangeDelta) * d3.event.scale + d3.event.translate[0]; }))

    graph.selectAll(".point")
        .attr("transform", function (d) { return "translate(" + xMap(d) + "," + yMap(d) + ")scale(" + d3.event.scale + ")"; });

    graph.select(".xAxis.axis").call(xAxis);
    graph.select(".yAxis.axis").call(yAxis);
这是一个更新的提琴: