Search code examples
umldiagramgraphviz

Graphviz top to bottom AND left to right


Hi there I want to have a uml sequence diagram with dot language, now I have the following problem I want to have the layout as follows with a, b, c and d in a straight line at top but with the lines going straight to the bottom. How can I achieve that?

a   b   c   d
|   |   |   | 
|   |   |   |

perhaps can I achieve that the a, b, c and d with its belonging edges are clusters where I set a different rankdir for the clusters?

EDIT Just found a solution by adding invisible edges between a, b, c and d but any other solutions?


Solution

  • What you describe seems to be what dot does by default.

    For example, this graph:

    digraph SO {
      a -> a1 -> a2
      b -> b1 -> b2
      c -> c1 -> c2
      d -> d1 -> d2
    } 
    

    Comes out like this:

    enter image description here

    If you have a more complex graph you can force nodes to be at the same height using rank=same. For example:

    digraph SO {
      { rank = same
        a b c d
      }
    
      a -> a1 -> a2 
      b -> b1 -> b2 -> b3 -> b4
      c -> c1 
      d -> d1 -> d2 -> d3
      d2 -> a2
    }
    

    Comes out like this:

    enter image description here

    However, if you want a, b, c and d to be in a specific order I think you're going to have to use invisible edges like you suggested. The dot guide even recommends this:

    Edge weights also play a role when nodes are constrained to the same rank. Edges with non-zero weight between these nodes are aimed across the rank in the samedirection (left-to-right, or top-to-bottom in a rotated drawing) as far as possible. This fact may be exploited to adjust node ordering by placing invisible edges (style="invis") where needed.