如何在点中控制子图的布局?

Ben*_*oît 31 dot graphviz

我有digraph许多独立和简单subgraphs的各种尺寸.dot水平放置所有这些子图,所以我最终得到一个40000x200输出文件,例如:

G1 G2 G3 G.....4 G5
Run Code Online (Sandbox Code Playgroud)

我如何告诉dot在两个维度中布局这些子图以获得类似的东西:

G1 G2 G3
G.....4
G5
Run Code Online (Sandbox Code Playgroud)

谢谢.

mar*_*pet 53

实现这一目标的步骤使用多个graphviz工具,这些工具可以通过管道连接在一起.

以下行是可能的配置,graph.dot是包含图表的文件.你可能不得不摆弄这些选择.

ccomps -x graph.dot | dot | gvpack -array3 | neato -Tpng -n2 -o graph.png
Run Code Online (Sandbox Code Playgroud)

这是解释:


1.分离断开的图形

工具:ccomps

将图分解为其连接的组件

-x选项(只有所连接的部件被印刷,作为单独的曲线图)可能是所有需要.


2.布置每个图形

工具:

每个有向图都是逐个布局的.获取节点和边的位置需要此步骤.


3.将所有布局图组合成一个

工具:gvpack

读取图形流,将图形组合成单个布局,并生成单个图形作为输入图形的并集.

您应该阅读此工具的选项文档并使用选项.例如,-array用于以类似网格的方式布置图形,并提供几个标志来控制布局.


4.创建输出

工具:neato

该选项-n2告诉neato不要布局输入图,而是使用现有的位置属性.


示例图:

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;
 }
}
Run Code Online (Sandbox Code Playgroud)

编辑:在gvpack中对有向图进行排序

为了确定由子图创建的组合布局中的子图的出现顺序gvpack,每个子图将需要一个sortv属性.

例如,以下图表:

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;
}
Run Code Online (Sandbox Code Playgroud)

可以使用转换

dot graph.dot | gvpack -array_u | neato -Tpng -n2 -o graph.png
Run Code Online (Sandbox Code Playgroud)

导致

带有序子图的压缩图