Search code examples
graphviz

graphviz subgraph show from top to down


I am using graphviz to draw a construction of a tree step by step.

It shows like the following:

enter image description here

The tree should show from top to down, not left to right.

The constructing code of the above image:

digraph test1 {
    subgraph cluster000005 {
        node_1 [label="2, 4"]
        node_2 [label=1]
        node_1 -> node_2
        node_3 [label=3]
        node_1 -> node_3
        node_4 [label=5]
        node_1 -> node_4
        label="add 5"
    }
    subgraph cluster000004 {
        node_5 [label=2]
        node_6 [label=1]
        node_5 -> node_6
        node_7 [label="3, 4"]
        node_5 -> node_7
        label="add 4"
    }
    subgraph cluster000003 {
        node_8 [label=2]
        node_9 [label=1]
        node_8 -> node_9
        node_10 [label=3]
        node_8 -> node_10
        label="add 3"
    }
    subgraph cluster000002 {
        node_11 [label="1, 2"]
        label="add 2"
    }
    subgraph cluster000001 {
        node_12 [label=1]
        label="add 1"
    }
    rankdir=LR
}


Solution

  • Is this what you are after?

    • remove rankdir statement
    • add invisible edges to stack clusters (vertically)
    • lots of fiddling to get clusters to align nicely - added surrounding clusters

    This:

    digraph test1 {
        // added "invisible clusters" to get the "real clusters"
        //   to align vertically
        //   don't understand why this was necessary
        subgraph clusterInvis1 {
        subgraph cluster000005 {
            node_1 [label="2, 4" ]
            node_2 [label=1]
            node_3 [label=3]
            node_4 [label=5]
            node_1 -> node_2
            node_1 -> node_3
            node_1 -> node_4
            label="add 5"
        }
        subgraph clusterInvis2 {    
        subgraph cluster000004 {
            node_5 [label=2]
            node_6 [label=1]
            node_7 [label="3, 4"]
            node_5 -> node_6
            node_5 -> node_7
            label="add 4"
        }
        subgraph cluster000003 {
            node_8 [label=2 ]
            node_9 [label=1]
            node_10 [label=3 ]
            node_8 -> node_9
            node_8 -> node_10
            label="add 3"
        }
        peripheries=0  // place here for cluster only (not nodes)
        }
        peripheries=0  // place here for cluster only (not nodes)
        }
        subgraph cluster000002 {
            node_11 [label="1, 2" ]
            label="add 2"
        }
        subgraph cluster000001 {
            node_12 [label=1 ]
            label="add 1"
        }
        //rankdir=LR
        edge [style=invis]
        node_12 -> node_11 -> node_8
        // shorthand to define two edges
        {node_9 node_10} -> node_5  
        {node_6 node_7}  -> node_1
    }
    

    Gives:
    enter image description here