web-dev-qa-db-ja.com

サブグラフのレイアウトをドットで制御するにはどうすればよいですか?

私は、さまざまなサイズの多くの独立した単純なdigraphで構成されるsubgraphsを持っています。 dotはこれらすべてのサブグラフを水平に配置するため、最終的に40000x200の出力ファイルになります。例:

G1 G2 G3 G.....4 G5

dotに、これらのサブグラフを両方の次元でレイアウトして、次のようにする方法を教えてください。

G1 G2 G3
G.....4
G5

ありがとう。

31
Benoît

これを実現するための手順では、複数のgraphvizツールを使用します。これは一緒にパイプ処理できます。

次の行は可能な構成です。graph.dotは、グラフを含むファイルです。あなたはオプションをいじる必要があるかもしれません。

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

そしてここに説明があります:


1.切り離されたグラフを分離する

ツール:ccomps

グラフを連結成分に分解します

-xオプション(個別のグラフ)として、接続されたコンポーネントのみが印刷されます。


2.各グラフをレイアウトします

ツール:ドット

各有向グラフは1つずつレイアウトされます。このステップは、ノードとエッジの位置を取得するために必要です。


3.レイアウトされたすべてのグラフを1つにまとめます

ツール:gvpack

グラフのストリームを読み取り、グラフを1つのレイアウトに結合し、入力グラフの和集合として機能する1つのグラフを生成します。

このツールのオプションのドキュメントを読んで、オプションを試してみてください。例えば、 -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の有向グラフの並べ替え

出現順序を決定するためにod 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

51
marapet