How to create a cyclic graph using GraphViz DOT?

1.5k views Asked by At

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?

2

There are 2 answers

0
kotchwane On BEST ANSWER

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

0
PM 2Ring On

It might be possible to achieve using DOT; I haven't played with it for a couple of years, so I'm a bit rusty. However, your data is rendered as a neat diamond if you use dot's sister program circo, which should be part of a normal GraphViz installation.