Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding header and footer in graphviz

Tags:

graphviz

dot

I have a gv code as below. I want to add some text or image as header and footer to the generated graph.

digraph  testdot {

label=" Name: MY NAME \l Address:  Address ...... \l ";

START_NODE [ shape=ellipse label= "START" ]; 
ERROR_NODE0 [ shape=box label= "Error0" ]; 
ERROR_NODE1 [ shape=box label= "Error1" ]; 
ERROR_NODE2 [ shape=box label= "Error2" ]; 
ERROR_NODE3 [ shape=box label= "Error3" ]; 

Statement_0 [ shape=diamond label= "if foo " ]; 
Statement_1 [ shape=diamond label= "if foo1" ]; 
Statement_2 [ shape=diamond label= "if foo2" ]; 
Statement_3 [ shape=diamond label= "if foo3" ]; 

START_NODE -> Statement_0; 
Statement_0 -> Statement_1 [label= "No" ];
Statement_0 -> ERROR_NODE0 [label= "Yes" ];
Statement_1 -> Statement_2 [label= "No" ];
Statement_1 -> ERROR_NODE1 [label= "Yes" ];
Statement_2 -> Statement_3 [label= "No" ];
Statement_2 -> ERROR_NODE2 [label= "Yes" ];
Statement_3 -> Statement_4 [label= "No" ];
Statement_3 -> ERROR_NODE3 [label= "Yes" ];
}

Below is an example of how I want the output as

Below is an example of how I want the output as

like image 483
Sushil Avatar asked Jan 14 '15 05:01

Sushil


1 Answers

If using 'dot' for this task, dot does not allow to control the position of elements of your graph. That said, if you know the structure of your graph, you can do some tricks using subgraphs, ranks and hidden edges.

This would be a possible solution for your graph:

digraph  testdot {

subgraph clusterHeader {
    margin=0
    style="invis"
    HEADER [shape="box" label="This is the header"];   
}

subgraph clusterMain {
    margin=0
    style="invis"
    START_NODE [ shape=ellipse label= "START" ]; 
    ERROR_NODE0 [ shape=box label= "Error0" ]; 
    ERROR_NODE1 [ shape=box label= "Error1" ]; 
    ERROR_NODE2 [ shape=box label= "Error2" ]; 
    ERROR_NODE3 [ shape=box label= "Error3" ]; 

    Statement_0 [ shape=diamond label= "if foo " ]; 
    Statement_1 [ shape=diamond label= "if foo1" ]; 
    Statement_2 [ shape=diamond label= "if foo2" ]; 
    Statement_3 [ shape=diamond label= "if foo3" ]; 

    START_NODE -> Statement_0; 
    Statement_0 -> Statement_1 [label= "No" ];
    Statement_0 -> ERROR_NODE0 [label= "Yes" ];
    Statement_1 -> Statement_2 [label= "No" ];
    Statement_1 -> ERROR_NODE1 [label= "Yes" ];
    Statement_2 -> Statement_3 [label= "No" ];
    Statement_2 -> ERROR_NODE2 [label= "Yes" ];
    Statement_3 -> Statement_4 [label= "No" ];
    Statement_3 -> ERROR_NODE3 [label= "Yes" ];
}

subgraph clusterFooter {
    margin=0
    style="invis"
    LABEL_1 [shape="none" margin=0 label="NAME: My name\lAddress: 23 XYZ road"];
    {rank="sink"; FOOTER [shape="box" label="Footer text goes here"];}
}

// Connecting the subgraps in order. Try to connect a bottom node of your main
// clusterMain to LABEL_1
HEADER->START_NODE [style=invis];
ERROR_NODE3->LABEL_1 [style=invis weight=0];
LABEL_1->FOOTER [style=invis weight=0];

}
like image 130
Jorge Torres Avatar answered Sep 21 '22 07:09

Jorge Torres