5

Graphviz で次のグラフを生成したい:

ご希望のレイアウト

ここで説明する理由により、これは次のとおりです。

digraph
{
   layout=dot;
   rankdir="LR";
   overlap = true;
   node[shape=record, height="0.4", width="0.4"];
   edge[dir=none];

   A; B; C; D; E; F; G; H; I;

   A -> B -> C;
   D -> E -> F;
   G -> H -> I;
   edge[constraint=false];
   A -> D -> G;

   subgraph clusterX
   {
      label="Cluster 1";
      A; B;
   }

   subgraph clusterY
   {
      label="Cluster 2";
      E; F; H; I;
   }

}

これを生成します:

望まないレイアウト

ノードの出現順序を慎重に微調整した後:

   F; E; I; H; D; G; A; B; C;

正しい結果が得られます。

これは機能しますが、ノードの配置をより直接的に制御したいので、pos を使用してノードの場所を強制できるように、neato に切り替えてみました。

graph g
{
   layout=neato;
   node[shape=record, height="0.4", width="0.4"];
   edge[dir=none];

   A [pos="1,3!"];
   B [pos="2,3!"];
   C [pos="3,3!"];
   D [pos="1,2!"];
   E [pos="2,2!"];
   F [pos="3,2!"];
   G [pos="1,1!"];
   H [pos="2,1!"];
   I [pos="3,1!"];

   A -- B -- C;
   D -- E -- F;
   G -- H -- I;
   A -- D -- G;

   subgraph clusterX
   {
      label="Cluster 1";
      A;
      B;
   }

   subgraph clusterY
   {
      label="Cluster 2";
      E; F; H; I;
   }
}

これにより、次の結果が得られます。

ここに画像の説明を入力

クラスター境界とクラスター内のノードの間にパディングを追加するにはどうすればよいですか (ドットと同じ方法で)。

4

2 に答える 2

4

私はパーティーのプーパーになるのは嫌いですが、固定位置とクラスターを使用したニートのアプローチが成功するとは思いません。

クラスタのサポートは、レイアウト エンジンに依存します。すべてのエンジンが同程度にサポートしているわけではありません

良くも悪くも、クラスターのサブグラフは DOT 言語の一部ではなく、特定のレイアウト エンジンが準拠している構文規則にすぎないことに注意してください。

Neatoクラスタをサポートするエンジンの一部ではないようですfdp。また、naito のようなレイアウトはサポートしていますが、固定位置はサポートしていません

上記のリンクされたフォーラム エントリで、ERG はある時点でgvprスクリプトを使用してこれを実現することを提案していますが、おそらくあなたが考えていた解決策ではないでしょう。

ちなみに、グラフは有向グラフであってはいけません。警告が出て、すべて->をに置き換えました--

于 2012-03-27T19:28:04.483 に答える