i have a digraph
composed of many independant and simple subgraphs
of various sizes. dot
lays all these subgraphs horizontally, so i e
The steps to achieve this uses multiple graphviz tools which can be piped together.
The following line is a possible configuration, graph.dot being the file which contains your graph(s). You may have to fiddle with the options.
ccomps -x graph.dot | dot | gvpack -array3 | neato -Tpng -n2 -o graph.png
And here's the explanation:
Tool: ccomps
decomposes graphs into their connected components
The -x
option (Only the connected components are printed, as separate graphs) is probably all that is needed.
Tool: dot
Each directed graph is layed out, one by one. This step is needed to get the position of the nodes and edges.
Tool: gvpack
reads in a stream of graphs, combines the graphs into a single layout, and produces a single graph serving as the union of the input graphs.
You should read the documentation of the options for this tool and play with the options. For example, -array
is used to lay out the graphs in a grid like manner, and offers several flags to control the layout.
Tool: neato
The option -n2
tells neato to not layout the input graphs but to use the existing position attributes.
Example graph:
digraph G {
subgraph G1 {
a->{b; c;};
}
subgraph G2 {
d -> {e; f;};
}
subgraph G3 {
g -> h;
}
subgraph G4 {
i -> j;
}
subgraph G5 {
{k; l;} -> m;
}
}
Edit: Sorting the digraphs in gvpack
In order to determine the order of appearance od the subgraphs in the combined layout created by gvpack
, each subgraph will need a sortv
attribute.
For example, the following graphs:
digraph G1 {
sortv=1;
a->{b; c;};
}
digraph G2 {
sortv=2;
d -> {e; f;};
}
digraph G3 {
sortv=3;
g -> h;
}
digraph G4 {
sortv=4;
i -> j;
}
digraph G5 {
sortv=5;
{k; l;} -> m;
}
can be transformed using
dot graph.dot | gvpack -array_u | neato -Tpng -n2 -o graph.png
resulting in