Search code examples
dot

How to create a cyclic graph using GraphViz DOT?


I tried to create a simple cyclic graph with this DOT input file:

digraph {
    rankdir=LR;

    node0 [label = "0",  group="bottom"]; 
    node1 [label = "1", group="bottom"]; 
    node2 [label = "2", group="top"]; 
    node3 [label = "3", group="top"]; 

    node0 -> node1; 
    node1 -> node0; 

    node2 -> node3; 
    node3 -> node2; 
}

and so far so good, it results in:

First try at a cyclic graph

but now I want to have the following relationships added to the nodes:

node0 -> node3; 
node3 -> node0; 

node2 -> node1; 
node1 -> node2; 

and surprisingly, this results in:

Unsatisfactory horizontal node placement

If I remove rankdir=LR;, I get a vertical graph. I need a simple cyclic graph, since the node placement in space has a connection to what they relate to. So the new connections should be vertical, and the nodes should form a square. Is this possible to achieve using DOT?


Solution

  • One way with dot would be to order the nodes in two rows:

    digraph {
         0 -> {1 3}
         1 -> {0 2}
         2 -> {3 1}
         3 -> {2 0}
         // Put specified nodes on same row:
         {rank=same; 0; 1}
         {rank=same; 2; 3}
    }
    
    
    

    Formatted Graph