206

DOT言語でGraphViz、依存関係図を表現しようとしています。コンテナ内にノードを配置し、ノードやコンテナを他のノードやコンテナに依存させることができる必要があります。

subgraphコンテナを表すために使用しています。ノードのリンクは問題なく機能しますが、サブグラフを接続する方法がわかりません。

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

ここに画像の説明を入力してください

4

3 に答える 3

242

DOTユーザーマニュアルには、クラスター間にエッジがあるクラスターを含むグラフの次の例が示されています。

重要:最初のcompound=trueステートメントが必要です。

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

...およびノー​​ドとクラスター間のエッジ:

ここに画像の説明を入力してください

于 2010-01-06T10:03:29.590 に答える
101

参照しやすいように、元の質問に直接適用された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];
}

宣言のcompound=true中では非常に重要です。graphそれは出力を生成します:

クラスターが接続されたグラフ

エッジをクラスター内の参照ノードに変更し、各エッジにltail属性とlhead属性を追加し、クラスター名を指定し、グラフレベルの属性「compound=true」を追加したことに注意してください。

内部にノードがないクラスターを接続したいという心配については、私の解決策は、常にすべてのクラスターにノードを追加し、style=plaintextでレンダリングすることでした。このノードを使用して、クラスターにラベルを付けます(クラスターの組み込みの「label」属性の代わりに、空の文字列に設定する必要があります(Pythonの場合label='""')。これは、クラスターを直接接続するエッジを追加しないことを意味しますが、私の特定の状況で動作します。

于 2012-05-29T16:11:01.793 に答える
13

fdpファイルにレイアウトを使用していることを確認してください。neatoクラスターをサポートしているとは思いません。

于 2012-10-11T23:14:21.427 に答える