How to control subgraphs' layout in dot?

前端 未结 1 1515
既然无缘
既然无缘 2020-12-12 18:22

i have a digraph composed of many independant and simple subgraphs of various sizes. dot lays all these subgraphs horizontally, so i e

1条回答
  •  囚心锁ツ
    2020-12-12 18:39

    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:


    1. Separate disconnected graphs

    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.


    2. Layout each graph

    Tool: dot

    Each directed graph is layed out, one by one. This step is needed to get the position of the nodes and edges.


    3. Pack all layed out graphs into one

    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.


    4. Create the output

    Tool: neato

    The option -n2 tells neato to not layout the input graphs but to use the existing position attributes.


    Example graph:

    graphiz gvpack

    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

    packed graph with ordered subgraphs

    0 讨论(0)
提交回复
热议问题