20

Graphvizを使用して単純な有限状態マシングラフを視覚化しようとしています。Graphvizによって作成されたレイアウトは、完全に私の好みではありません。エッジが短く、よりコンパクトな結果を期待していました。

これまで、グループを使用してエッジの重みを変更してみましたが、あまりうまくいきませんでした。Graphvizがグラフをそのように描画する理由と、そのアルゴリズムを自分の好みに合わせて調整する方法は、私にはわかりません。それを達成するために設定できるパラメータはありますか?または、別のコマンドを使用する必要がありdotますか?試してみneatoましたが、結果がめちゃくちゃになってしまい、何をしているのかよくわかりません...

これはこれまでの私の最高の結果です:

有限状態機械、これまでのところ最良の結果

これよりも優れたレイアウトを視覚化しようとすると、たとえばこの写真の矢印で示されているように、赤いボックスの配置が異なる場合、グラフの見栄えが良くなると思います。

有限状態機械、より良い結果を想像

私は以前dotグラフを作成していましたが、彼のソースコードは次のとおりです。

  1 digraph JobStateDiagram
  2 {
  3   rankdir=LR;
  4   size="8,5";
  5 
  6   node  [style="rounded,filled,bold", shape=box, fixedsize=true, width=1.3, fontname="Arial"];
  7   Created   [fillcolor=black, shape=circle, label="", width=0.25];
  8   Destroyed [fillcolor=black, shape=doublecircle, label="", width=0.3];
  9   Empty     [fillcolor="#a0ffa0"];
 10   Announced [fillcolor="#a0ffa0"];
 11   Assigned  [fillcolor="#a0ffa0"];
 12   Working   [fillcolor="#a0ffa0"];
 13   Ready     [fillcolor="#a0ffa0"];
 14   TimedOut  [fillcolor="#ffa0a0"];
 15   Failed    [fillcolor="#ffa0a0"];
 16 
 17   {
 18     rank=source; Created Destroyed;
 19   }
 20 
 21   edge  [style=bold, fontname="Arial" weight=2]
 22   Empty     -> Announced [ label="announce"   ];
 23   Announced -> Assigned  [ label="assign"     ];
 24   Assigned  -> Working   [ label="start"      ];
 25   Working   -> Ready     [ label="finish"     ];
 26   Ready     -> Empty     [ label="revoke"     ];
 27 
 28   edge  [fontname="Arial" color="#aaaaaa" weight=1]
 29   Announced -> TimedOut  [ label="timeout"    ];
 30   Assigned  -> TimedOut  [ label="timeout"    ];
 31   Working   -> TimedOut  [ label="timeout"    ];
 32   Working   -> Failed    [ label="error"      ];
 33   TimedOut  -> Announced [ label="announce"   ];
 34   TimedOut  -> Empty     [ label="revoke"     ];
 35   Failed    -> Announced [ label="announce"   ];
 36   Failed    -> Empty     [ label="revoke"     ];
 37 
 38   edge  [style=bold, fontname="Arial" weight=1]
 39   Created   -> Empty     [ label="initialize" ];
 40   Empty     -> Destroyed [ label="finalize"   ];
 41   Announced -> Empty     [ label="revoke"     ];
 42   Assigned  -> Empty     [ label="revoke"     ];
 43   Working   -> Empty     [ label="revoke"     ];
 44 }

また、上記のGraphvizファイルで奇妙なことをした場合は、誰かに知らせてください。フィードバックをいただければ幸いです。


アップデート:

ユーザーmarapetによって与えられたポートのようないくつかの提案をもっと実験して試してみると、私の混乱が増しました...たとえば、下の写真では、直線ではなく、とdotのためにこれらの奇妙な迂回路を描くことを選択するのはなぜですか?Working->FailedFailed->Announced

奇妙な長いエッジを持つグラフ

4

2 に答える 2

18

私には、あなたの出力は大丈夫に見えます。TimedOutFailedはもちろん右端ですWorking。これdotが最も効果的であり、graphviz レイアウトを調整するために微調整を行うことはできますが、特定のグラフ レイアウトを作成してすべてを制御したい場合は、別のツールを使用する方がよいと思います。

そうは言っても、graphvizで簡単に試してみました。いくつかの線を変更して、すべての緑色のノードで直線を作成し、質問に示されているように赤いノードを揃えました。エッジ コンセントレータも追加しましたが、結果は良くありません。

digraph JobStateDiagram
{
  rankdir=LR;
  size="8,5";
  concentrate=true;

  node  [style="rounded,filled,bold", shape=box, fixedsize=true, width=1.3, fontname="Arial"];
  Created   [fillcolor=black, shape=circle, label="", width=0.25];
  Destroyed [fillcolor=black, shape=doublecircle, label="", width=0.3];
  Empty     [fillcolor="#a0ffa0"];
  Failed    [fillcolor="#ffa0a0"];
  Announced [fillcolor="#a0ffa0"];
  Assigned  [fillcolor="#a0ffa0"];
  Working   [fillcolor="#a0ffa0"];
  Ready     [fillcolor="#a0ffa0"];
  TimedOut  [fillcolor="#ffa0a0"];

  {
    rank=source; Created; Destroyed;
  }
  {
    rank=same;Announced;Failed;
  }
  {
    rank=same;Assigned;TimedOut;
  }

  edge  [style=bold, fontname="Arial", weight=100]
  Empty     -> Announced [ label="announce"   ];
  Announced -> Assigned  [ label="assign"     ];
  Assigned  -> Working   [ label="start"      ];
  Working   -> Ready     [ label="finish"     ];
  Ready     -> Empty     [ label="revoke", weight=1     ];

  edge  [color="#aaaaaa", weight=1]
  Announced -> TimedOut  [ label="timeout"    ];
  Assigned  -> TimedOut  [ label="timeout"    ];
  Working   -> TimedOut  [ label="timeout"    ];
  Working   -> Failed    [ label="error"      ];
  TimedOut  -> Announced [ label="announce"   ];
  TimedOut  -> Empty     [ label="revoke"     ];
  Failed    -> Announced [ label="announce"   ];
  Failed    -> Empty     [ label="revoke"     ];

  Created   -> Empty     [ label="initialize" ];
  Empty     -> Destroyed [ label="finalize"   ];
  Announced -> Empty     [ label="revoke"     ];
  Assigned  -> Empty     [ label="revoke"     ];
  Working   -> Empty     [ label="revoke"     ];
}

グラフビズ出力

ポートを使用してエッジの開始点と終了点を制御することで改善することもできます。

あなたのドットファイルの奇妙な点についてのあなたの質問について:行番号(最終的にテキストエディタの列モードをうまく利用することができました) とaligningを除いて、あなたのファイルは私には問題ないように見えます. 可能な限り、ドット ファイルを同様に構成します (グラフ プロパティ、ノード リスト、グループ化、エッジ)。ノードの最初の出現順序が最終的なレイアウトに影響を与える可能性があることに注意してください。

于 2012-07-21T16:48:40.447 に答える