How to force all nodes in the same column in graphviz?

Davy Landman picture Davy Landman · Sep 25, 2009 · Viewed 11.3k times · Source

I'm trying to model a certain flow using graphviz, and I can't figure out how to model the following graph to share the same horizontal center

digraph exmp {
   A -> B -> C -> D
   C -> E [constraint=false]
   A -> C [style="dotted", constraint=false]
   A -> D [style="dotted",  constraint=false]
   B -> D [constraint=false]
   D -> A [style="dashed", constraint=false]
   C -> A [style="dashed", constraint=false]


   subgraph cluster_hackToSinkIt { E -> F }
   { rank="sink" E F }
}

this results in the following graph:

rendered image

My question is, how can I get the E -> F to be positioned under D such that is lies in the same column?

Answer

Mark Rushakoff picture Mark Rushakoff · Sep 25, 2009

At least as of May 2007, you can't force "columns" per se, but you can apply weight to edges which should help force alignment. But actually, in this case, if you just add an invisible edge from D to E, you've got vertical alignment.

digraph exmp {
    A -> B -> C -> D
    C -> E [constraint=false]
    A -> C [style="dotted", constraint=false]
    A -> D [style="dotted",  constraint=false]
    B -> D [constraint=false]
    D -> A [style="dashed", constraint=false]
    C -> A [style="dashed", constraint=false]
    D -> E [style="invis"] // <---- important new line


    subgraph cluster_hackToSinkIt { E -> F }
    { rank="sink" E F }
}

fixed dot image

I'm not aware of any way to force edges to one side or another.