我有digraph
由许多独立且简单subgraphs
的各种尺寸组成。 dot
水平放置所有这些子图,所以我最终得到一个40000x200输出文件,例如:
G1 G2 G3 G.....4 G5
我如何告诉dot
在两个维度中布局这些子图以获得类似的内容:
G1 G2 G3
G.....4
G5
感谢。
答案 0 :(得分:50)
实现此目标的步骤使用多个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
导致