Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

graphviz/dot: can the distance between two nodes be set individually?

I'm trying to use dot (version 2.28.0) in order to make a flow chart of my source code. For that, I would like the graph to consist of subgraphs where each of these subgraphs represents a source file in the code base. At the top of each subgraph, there should be the file name as a node in a visually easily distinguishable fashion (i.e. bold, white text on dark blue background). Below the file name node should be the nodes representing the flow of routines in that file in the order they are being called.

My problem now is that I would like the distance between "filename nodes" and "routine nodes" to be smaller than the distance between individual "routine nodes", plus, there should be no arrow between.

I tried to use the minlen attribute for the edge connecting the "filename node" to the first "routine node", but when I set that to a value below 1.0, the two nodes come out next to each other rather than stacked.

Is there any way to make the first two nodes be closer to each other than the other two, yet top/bottom oriented?

digraph "prog.c"
{
    edge [fontname="FreeSans",fontsize="12",labelfontname="FreeSans",labelfontsize="10"];
    node [fontname="FreeSans",fontsize="14",shape=record,height=0.2];
    compound=true;

    subgraph cluster_main {
        Node1_0 [label="main.c", shape=folder, fontcolor="white", style=filled, fillcolor="#00008b"];
        Node1_1 [label="routine1()"];
        Node1_2 [label="routine2()"];
        edge [color="transparent", minlen="0.5"]; // stacking not ok
        // edge [color="transparent", minlen="1.0"]; // stacking ok
        Node1_0 -> Node1_1 ;
        edge [color="black", minlen="1.0"];
        Node1_1 -> Node1_2 ;
    }
}

Edit: I should have commented out the line which lead to the undesired result rather than the one leading to the desired result (I had planned to attach two pngs for clarification, but I'm not allowed to do so as a newbie); so here is the code I would actually want to modify in a way that the first two nodes have a different (smaller) distance to each than the last two.

digraph "prog.c"
{
    edge [fontname="FreeSans",fontsize="12",labelfontname="FreeSans",labelfontsize="10"];
    node [fontname="FreeSans",fontsize="14",shape=record,height=0.2];
    compound=true;

    subgraph cluster_main {
        Node1_0 [label="main.c", shape=folder, fontcolor="white", style=filled, fillcolor="#00008b"];
        Node1_1 [label="routine1()"];
        Node1_2 [label="routine2()"];
        //edge [color="transparent", minlen="0.5"]; // stacking not ok
        edge [color="transparent", minlen="1.0"]; // stacking ok
        Node1_0 -> Node1_1 ;
        edge [color="black", minlen="1.0"];
        Node1_1 -> Node1_2 ;
    }
}
like image 653
lineinthesand Avatar asked Mar 04 '14 09:03

lineinthesand


1 Answers

There are a couple of "graph" properties that can control what you need. pad, ranksep, nodesep

Also, I increased your node size, but only for my own ease of use...

digraph "prog.c"
{
    graph [pad=".75", ranksep="0.25", nodesep="0.25"];
    node [fontname="FreeSans",fontsize="14",shape=record,width=2, height=.5];
    edge [fontname="FreeSans",fontsize="12",labelfontname="FreeSans",labelfontsize="10"];

    compound=true;

    subgraph cluster_main {
        Node1_0 [label="main.c", shape=folder, fontcolor="white", style=filled, fillcolor="#00008b"];
        Node1_1 [label="routine1()"];
        Node1_2 [label="routine2()"];
        edge [color="transparent", minlen="0.5"]; // stacking not ok
        // edge [color="transparent", minlen="1.0"]; // stacking ok
        Node1_0 -> Node1_1 ;
        edge [color="black", minlen="1.0"];
        Node1_1 -> Node1_2 ;
    }
}
like image 173
OldDogNewTricks Avatar answered Sep 28 '22 08:09

OldDogNewTricks