DOT
のGraphViz
言語では、依存関係図を表現しようとしています。コンテナ内にノードを持ち、ノードやコンテナを他のノードやコンテナに依存させることができる必要があります。
subgraph
を使用して、コンテナーを表します。 Nodeリンクは正常に機能しますが、サブグラフを接続する方法がわかりません。
以下のプログラムでは、cluster_1
とcluster_2
を矢印で接続できる必要がありますが、クラスターを接続する代わりに新しいノードを作成しようとしました。
digraph G {
graph [fontsize=10 fontname="Verdana"];
node [shape=record fontsize=10 fontname="Verdana"];
subgraph cluster_0 {
node [style=filled];
"Item 1" "Item 2";
label = "Container A";
color=blue;
}
subgraph cluster_1 {
node [style=filled];
"Item 3" "Item 4";
label = "Container B";
color=blue;
}
subgraph cluster_2 {
node [style=filled];
"Item 5" "Item 6";
label = "Container C";
color=blue;
}
// Renders fine
"Item 1" -> "Item 2";
"Item 2" -> "Item 3";
// Both of these create new nodes
cluster_1 -> cluster_2;
"Container A" -> "Container C";
}
DOTユーザーマニュアルは、クラスター間のエッジを持つクラスターのグラフの次の例を提供します。
digraph G {
compound=true;
subgraph cluster0 {
a -> b;
a -> c;
b -> d;
c -> d;
}
subgraph cluster1 {
e -> g;
e -> f;
}
b -> f [lhead=cluster1];
d -> e;
c -> g [ltail=cluster0,lhead=cluster1];
c -> e [ltail=cluster0];
d -> h;
}
ノードとクラスター間のエッジ。
簡単に参照できるように、元の質問に直接適用されるHighPerformanceMarkの回答で説明されているソリューションは、次のようになります。
digraph G {
graph [fontsize=10 fontname="Verdana" compound=true];
node [shape=record fontsize=10 fontname="Verdana"];
subgraph cluster_0 {
node [style=filled];
"Item 1" "Item 2";
label = "Container A";
color=blue;
}
subgraph cluster_1 {
node [style=filled];
"Item 3" "Item 4";
label = "Container B";
color=blue;
}
subgraph cluster_2 {
node [style=filled];
"Item 5" "Item 6";
label = "Container C";
color=blue;
}
// Edges between nodes render fine
"Item 1" -> "Item 2";
"Item 2" -> "Item 3";
// Edges that directly connect one cluster to another
"Item 1" -> "Item 3" [ltail=cluster_0 lhead=cluster_1];
"Item 1" -> "Item 5" [ltail=cluster_0 lhead=cluster_2];
}
graph
宣言のcompound=true
は重要です。それは出力を生成します:
クラスター内のノードを参照するようにエッジを変更し、クラスター名を指定してltailおよびlhead属性を各Edgeに追加し、グラフレベルの属性「compound = true」を追加したことに注意してください。
内部にノードのないクラスターを接続したいという懸念について、私の解決策はalwaysをすべてのクラスターに追加し、style = plaintextでレンダリングすることでした。このノードを使用して、クラスターにラベルを付けます(クラスターの組み込みの "label"属性ではなく、空の文字列(Pythonではlabel='""'
)に設定する必要があります。これは、接続するエッジを追加しないことを意味します。直接クラスター化されますが、特定の状況では機能します。
ファイルにfdp
レイアウトを使用していることを確認してください。 neato
はクラスターをサポートするとは思わない。