【发布时间】:2011-12-21 14:06:43
【问题描述】:
我有一个digraph,由许多不同大小的独立且简单的subgraphs 组成。 dot 将所有这些子图水平放置,所以我最终得到一个 40000x200 的输出文件,例如:
G1 G2 G3 G.....4 G5
我如何告诉dot 在两个维度上布局这些子图以获得类似:
G1 G2 G3
G.....4
G5
谢谢。
【问题讨论】:
我有一个digraph,由许多不同大小的独立且简单的subgraphs 组成。 dot 将所有这些子图水平放置,所以我最终得到一个 40000x200 的输出文件,例如:
G1 G2 G3 G.....4 G5
我如何告诉dot 在两个维度上布局这些子图以获得类似:
G1 G2 G3
G.....4
G5
谢谢。
【问题讨论】:
实现这一点的步骤使用了多个graphviz工具,这些工具可以通过管道连接在一起。
以下行是一个可能的配置,graph.dot 是包含您的图表的文件。您可能不得不摆弄选项。
ccomps -x graph.dot | dot | gvpack -array3 | neato -Tpng -n2 -o graph.png
下面是解释:
工具:ccomps
将图分解成它们的连通分量
-x 选项(仅打印连接的组件,作为单独的图表)可能就足够了。
工具:点
每个有向图都被一一布局。这一步是获取节点和边的位置所需要的。
工具:gvpack
读取图形流,将图形组合成一个布局, 并生成单个图作为输入图的并集。
您应该阅读此工具的选项文档并使用这些选项。例如,-array 用于以类似网格的方式对图形进行布局,并提供多个标志来控制布局。
工具:neato
选项-n2 告诉neato 不要布局输入图,而是使用现有的位置属性。
示例图:
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
导致
【讨论】:
ccomps 分隔断开的图。如果您不需要这个,您可以从一开始就创建单独的图表。您可以为每个(子)图添加sortv 属性。 “u”标志表示插入顺序基于附加到每个图的 sortv 属性。 - 因此,使用gvpack -array_u3 应该按照图的sortv 的值对图的外观进行排序属性。