0

I want to make the root go from right to left.

var treeData = { "name": "NODE NAME 1",
"subname": "CODE N1",
"fill":"orange", "children": [ { "name": "NODE NAME 2.1", "subname": "CODE N1",
"fill":"blue" }, { "name": "NODE NAME 2.2","subname": "CODE N1" ,"fill":"blue" }, { "name": "NODE NAME 2.3","subname": "CODE N1","fill":"blue", "children": [ { "name": "NODE NAME 3.3","fill":"blue","subname": "CODE N1", "children": [{ "name":"NODE NAME 4.1","subname": "CODE N1", "fill":"#d281d2" } ] }, { "name": "NODE NAME 3.4","fill":"blue", "subname": "CODE N1" , "children": [{ "name":"NODE NAME 4.2", "subname": "CODE N1" , "fill":"#d281d2" } ] } ] } ] };

// Set the dimensions and margins of the diagram
var margin = {top: 100, right: 30, bottom: 200, left: 30},
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

var orientations = {
    "top-to-bottom": {
        size: [width, height],
        x: function(d) { return d.x; },
        y: function(d) { return d.y; }
    },
    "right_to_left": {
        size: [height, width],
        x: function(d) { return width - d.y; },
        y: function(d) { return d.x; }
    },
    "bottom-to-top": {
        size: [width, height],
        x: function(d) { return d.x; },
        y: function(d) { return height - d.y; }
    },
    "left-to-right": {
        size: [height, width],
        x: function(d) { return d.y; },
        y: function(d) { return d.x; }
    }
    };

    //Delete d3 svg elements for redraw
    d3.select("#tree-container").selectAll("*").remove();

    // append the svg object to the body of the page
    // appends a 'group' element to 'svg'
    // moves the 'group' element to the top left margin
    var svg = d3.select("#tree-container").append("svg")
        .attr("width", width + margin.right + margin.left)
        .attr("height", height + margin.top + margin.bottom)
        .append("g")
        .attr("transform", "translate("
            + margin.left + "," + margin.top + ")");
    var i = 0,
        duration = 750,
        root;

    var o = orientations.right_to_left;

    // declares a tree layout and assigns the size
    var treemap = d3.tree().size([height, width]);

    // Assigns parent, children, height, depth
    root = d3.hierarchy(treeData, function(d) { return d.children; });
    root.x0 = height / 2;
    root.y0 = 0;

    // Collapse after the second level
    root.children.forEach(collapse);

    update(root);

    // Collapse the node and all it's children
    function collapse(d) {
        if(d.children) {
            d._children = d.children
            d._children.forEach(collapse)
            d.children = null
        }
    }

    function update(source) { 

        // Assigns the x and y position for the nodes
        var treeData = treemap(root);
    
        // Compute the new tree layout.
        var nodes = treeData.descendants(),
            links = treeData.descendants().slice(1);
    
        // Normalize for fixed-depth.
        nodes.forEach(function(d){ d.y = d.depth * 180});
    
        // ****************** Nodes section ***************************
    
        // Update the nodes...
        var node = svg.selectAll('g.node')
            .data(nodes, function(d) {return d.id || (d.id = ++i); });
    
        // Enter any new modes at the parent's previous position.
        var nodeEnter = node.enter().append('g')
            .attr('class', 'node')
            .attr("transform", function(d) {
                return "translate(" + source.y0 + "," + source.x0 + ")";
            })
            .on('click', click);
    
            var rectHeight = 60, rectWidth = 120;
            
            nodeEnter.append('rect')
            .attr('class', 'node')
            .attr("width", rectWidth)
            .attr("height", rectHeight)
            .attr("x", o.x)
            .attr("y", o.y)
            .attr("rx","5")
            .style("fill", function(d) {
                return d.data.fill;
            });
    
        // Add labels for the nodes
        nodeEnter.append('text')
            .attr("dy", o.y)
            .attr("x", o.x)
            .attr("text-anchor", function(d) {
                return "start";
            })
            .text(function(d) { return d.data.name; })
            .append("tspan")
            .attr("dy", o.y)
            .attr("x",function(d) { 
                return d.children || d._children ? 13 : -13; })
             // .text(function(d) { return d.data.subname; });
    
        // UPDATE
        var nodeUpdate = nodeEnter.merge(node);
    
        // Transition to the proper position for the node
        nodeUpdate.transition()
            .duration(duration)
            .attr("transform", function(d) { 
                return "translate(" + d.y + "," + d.x + ")";
            });
    
        // Update the node attributes and style
        nodeUpdate.select('circle.node')
            .attr('r', 10)
            .style("fill", function(d) {
                return d._children ? "lightsteelblue" : "#fff";
            })
            .attr('cursor', 'pointer');
    
    
        // Remove any exiting nodes
        var nodeExit = node.exit().transition()
            .duration(duration)
            .attr("transform", function(d) {
                return "translate(" + source.y + "," + source.x + ")";
            })
            .remove();
    
        // On exit reduce the node circles size to 0
        nodeExit.select('circle')
            .attr('r', 1e-6);
    
        // On exit reduce the opacity of text labels
        nodeExit.select('text')
            .style('fill-opacity', 1e-6);
    
        // ****************** links section ***************************
    
        // Update the links...
        var link = svg.selectAll('path.link')
            .data(links, function(d) { return d.id; });
    
        // Enter any new links at the parent's previous position.
        var linkEnter = link.enter().insert('path', "g")
            .attr("class", "link")
            .attr('d', function(d){
                var o2 = {x: source.x0, y: source.y0}
                return diagonal(o2, o2);
            })
            //.attr("d", function(d) { return [o.x(d), o.y(d)]; })
            .attr("marker-start", "url(#triangle)");
    
        // UPDATE
        var linkUpdate = linkEnter.merge(link);
    
        // Transition back to the parent element position
        linkUpdate.transition()
            .duration(duration)
            .attr('d', function(d){ return diagonal(d, d.parent) });
    
        // Remove any exiting links
        var linkExit = link.exit().transition()
            .duration(duration)
            .attr('d', function(d) {
                var o2 = {x: source.x, y: source.y}
                return diagonal(o2, o2)
            })
            .remove();

        //arrow
        svg.append("svg:defs").append("svg:marker")
        .attr("id", "triangle")
        .attr("refX", 6)
        .attr("refY", 6)
        .attr("markerWidth", 24)
        .attr("markerHeight", 24)
        .attr("orient", "right")
        .append("path")
        .attr("d", "M 0 0 12 6 0 12 3 6")
        .style("fill", "black");
    
        // Store the old positions for transition.
        nodes.forEach(function(d){
            d.x0 = d.x;
            d.y0 = d.y;
        });
    
        // Creates a curved (diagonal) path from parent to the child nodes
        function diagonal(s, d) {
    
            var path = `M ${s.y} ${s.x}
                    C ${(s.y + d.y) / 2} ${s.x},
                    ${(s.y + d.y) / 2} ${d.x},
                    ${d.y} ${d.x}`
    
            return path
        }
    
        // Toggle children on click.
        function click(d) {
            if (d.children) {
                d._children = d.children;
                d.children = null;
            } else {
                d.children = d._children;
                d._children = null;
            }
            update(d);
        }
    }
  • Does this answer your question? [Tree drawing orientation](https://stackoverflow.com/questions/11673335/tree-drawing-orientation) – Robin Mackenzie Aug 19 '21 at 13:50
  • I tried to follow But there is a problem with .attr("d", d3.svg.diagonal().projection(function(d) { return [o.x(d), o.y(d)]; })); Since it doesn't match the d3 version I installed. – user16499997 Aug 20 '21 at 04:56

0 Answers0