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

时间:2011-11-03 21:51:17

标签: graphviz dot

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

G1 G2 G3 G.....4 G5

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

G1 G2 G3
G.....4
G5

感谢。

1 个答案:

答案 0 :(得分:50)

实现此目标的步骤使用多个graphviz工具,可以将它们连接在一起。

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

ccomps -x graph.dot | dot | gvpack -array3 | neato -Tpng -n2 -o graph.png

以下是解释:


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;
 }
}

编辑:在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;
}

可以使用

进行转换
dot graph.dot | gvpack -array_u | neato -Tpng -n2 -o graph.png

导致

packed graph with ordered subgraphs