简体   繁体   English

D3缩放仅在轴上有效,在数据上无效

[英]D3 zoom only affect in axis and not in data

I am new with d3 library and I making some test. 我是d3库的新手,并且进行了一些测试。 I have a scatter plot with 4 quadrants and I'm trying to apply zoom. 我有一个具有4个象限的散点图,我正在尝试应用缩放。 When I zoom the scale of axis change, but the data position no. 当我缩放轴的比例时会改变,但是数据位置没有。

Here the code: 这里的代码:

//-----------------------------------CREAR GRAFICO SCATTER (sin nada en especial)-------------------------------------
            //Alto y ancho
            var w = 500;
            var h = 500;
            var padding = 0;

            var maxx = 0.30
            var minx = -0.30
            var maxy = 6
            var miny = -6
            //Static dataset
            var dataset = [
                            [0.12, 4], [0.05, 3], [0.15, -3], [-0.20, -5], [-0.10, 3]
                          ];

            //Funciones de escala
            var xScale = d3.scaleLinear()
                                 .domain([minx, maxx])
                                 .range([padding, h]);

            var yScale = d3.scaleLinear()
                                 .domain([miny, maxy])
                                 .range([h, padding]);

            var rScale = d3.scaleLinear()
                                 .domain([0, d3.max(dataset, function(d) { return d[1]; })])
                                 .range([2, 6]);

            //Eje x
            var xAxis = d3.axisBottom()
                .scale(xScale);;

            //Eje y
            var yAxis = d3.axisLeft()
                .scale(yScale);

            //Crear el elemento svg
            var svg = d3.select("#linegraph")
                        .append("svg")
                        .attr("width", w)
                        .attr("height", h);




            //Colores
            var c1 = svg.append("rect")
                .attr("width", (w/2) - padding)             
                .attr("height", (h/2)- padding)
                .attr("transform", "translate("+padding+","+padding+")")
                .attr("fill", "yellow");

            var c2 = svg.append("rect")
                .attr("width", (w/2) - padding)             
                .attr("height", (h/2)- padding)
                .attr("transform", "translate("+w/2+","+padding+")")
                .attr("fill", "green");

            var c3 = svg.append("rect")
                .attr("width", (w/2) - padding)             
                .attr("height", (h/2)- padding)
                .attr("transform", "translate("+padding+","+h/2+")")
                .attr("fill", "red");

            var c4 = svg.append("rect")
                .attr("width", (w/2) - padding)             
                .attr("height", (h/2)- padding)
                .attr("transform", "translate("+w/2+","+h/2+")")
                .attr("fill", "orange");

            //Añadimos el eje x
            var gX = svg.append("g")
                .attr("class", "axis")
                .attr("transform", "translate(0," + (h/2) + ")")
                .call(xAxis);

            //Añadimos el eje y
            var gY = svg.append("g")
                .attr("class", "axis")
                .attr("transform", "translate(" + (w/2)  + ",0)")
                .call(yAxis);

            //Creamos los puntos
            var datos = svg.selectAll("circle")
               .data(dataset)
               .enter()
               .append("circle")
               .attr("cx", function(d) {
                    return xScale(d[0]);
               })
               .attr("cy", function(d) {
                    return yScale(d[1]);
               })
               .attr("r", function(d) {
                    return 5;
               });


//--------------------------------- ZOOM---------------------------------------------------------------------              
            var zoom = d3.zoom()
                .scaleExtent([1, 40])
                .translateExtent([[-100, -100], [w + 90, h + 100]])
                .on("zoom", zoomed);

            svg.call(zoom);
            function zoomed() {
              svg.attr("transform", d3.event.transform);
              gX.call(xAxis.scale(d3.event.transform.rescaleX(xScale)));
              gY.call(yAxis.scale(d3.event.transform.rescaleY(yScale)));                          
            }

This is the plot without zoom: 这是没有缩放的图:

没有变焦

And this with zoom: 这与缩放:

缩放图形

As you can see the data points and the quadrants color do not affect zoom, but in scale of axis it does. 如您所见,数据点和象限颜色不会影响缩放,但是会影响轴的比例。

because of you attr svg transform ,try g=svg.append("g") and then use g append rect . 由于您进行了attr svg转换,请尝试g=svg.append("g") ,然后使用g append rect。 and in zoomed function g.attr("transform",d3.event.transform) 以及缩放功能g.attr("transform",d3.event.transform)

Try to add this line: 尝试添加以下行:

datos.attr("transform",d3.event.transform)

The zoomed function is something like this: 缩放功能如下所示:

        var zoom = d3.zoom()
            .scaleExtent([1, 40])
            .translateExtent([[-100, -100], [w + 90, h + 100]])
            .on("zoom", zoomed);

        svg.call(zoom);
        function zoomed() {
            svg.attr("transform", d3.event.transform);
            gX.call(xAxis.scale(d3.event.transform.rescaleX(xScale)));
            gY.call(yAxis.scale(d3.event.transform.rescaleY(yScale)));        
            datos.attr("transform",d3.event.transform)
        }   

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM