d3.js force layout auto zoom/scale after loading

后端 未结 3 1079
梦毁少年i
梦毁少年i 2020-12-15 05:24

I\'m using this nice force layout from Flowingdata.com to create a network diagram.

\"enter

3条回答
  •  Happy的楠姐
    2020-12-15 06:13

    Your code should be similar to this

       vis = d3.select(selection)
            .append("svg")
            .attr("viewBox", "0 0 " + width + " " + height )
            .attr("preserveAspectRatio", "xMidYMid meet")
            .attr("pointer-events", "all")
            .call(zoomListener)
            .on("zoom", redraw));
    
       var mainGroup = vis.append('g');
    
       function zoom() {
            mainGroup.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale +              ")");
       }       
    
        var zoomListener = d3.behavior.zoom().on("zoom", zoom);
    
        var xArray = YOUR_NODES.map(function(d) { //YOUR_NODES is something like json.nodes after forse.end()
            return d.x
        });
    
        var minX = d3.min(xArray);
        var maxX = d3.max(xArray);
    
        var scaleMin = Math.abs(width / (maxX - minX));
        var startX = (minX) / scaleMin;
        var startY = 50  / scaleMin;
    
        // Same as in the zoom function
        mainGroup.attr("transform", "translate(" + [startX, startY] + ")scale(" + scaleMin + ")");
    
        // Initialization start param of zoomListener
        zoomListener.translate([startX, startY]);
        zoomListener.scale(scaleMin);
        zoomListener.scaleExtent([scaleMin, 1])
        vis.call(zoomListener);
    

    This code work only for xAxis. Because "global circle" svg RX === RY. If it not was for you then you can add same logic for yAxis var startY. Also you need to adjust the initial coordinates considering cr of circle nodes.

提交回复
热议问题