Search code examples
graphviz

Graphviz: how to have sub-graph nodes lined-up in a straight line?


I'm trying to visualize the history of my source-code repository using Graphviz in the following fashion (top-to-bottom or left-to-right doesn't matter):

m1 -> m2 ----> m3 -----> m4 -> m5
    \                    ^
     \-> b1 -> b2 -> b3 -/

Given this dot file:

digraph git {
    subgraph master {
        m1 -> m2 -> m3 -> m4 -> m5
    }
    subgraph branch {
        m2 -> b1 // branch from master
        b1 -> b2 -> b3
        b3 -> m4 // merge into master
    }
}

Graphviz diagram

what attribute should I set to have all the nodes of a sub-graph (that belongs to the same branch) to be placed on a straight-line?


Solution

  • The simplest solution is to set the weight of the branching and merging edges to 0:

    digraph git {
        rankdir=LR
        subgraph master {
            m1 -> m2 -> m3 -> m4 -> m5
        }
        subgraph branch {
            m2 -> b1[weight=0] // branch from master
            b1 -> b2 -> b3
            b3 -> m4[weight=0] // merge into master
        }
    }
    

    rankdir=LR changes the layout from top-bottom to left-right.

    graphviz graph

    See also my answers to a similar question: Forcing "main line" nodes into a straight line in Graphviz (or alternatives)