2012-07-21 29 views
6

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

これまでのところ、私はグループを使い、エッジの重みを変えようとしましたが、あまり運がありませんでした。なぜGraphvizがグラフを描くのか、アルゴリズムを自分の好みに合わせる方法は私には分かりません。それを達成するために設定できるパラメータはありますか?または、dot以外のコマンドを使用する必要がありますか?私はneatoを試みたが、結果は完全に台無しにして、もう一度、私は本当に私がやっているのか理解していないに見えた...

これは、これまでの私の最高の結果である:

視覚化しようとすると

Finite State Machine, best result so far

Finite State Machine, imagined better result

:この写真の矢印のように、これよりも優れたレイアウトは、私は、赤い箱が異なって整列させた場合のグラフは、例えば、よりコンパクトな見た目が良くなると思い次のよう

私はグラフと彼のソースコードを作成するために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を迂回しますか?

Graph with strange long edges

+0

有向グラフ(dot、twopi、circo、patchwork、osage)用のいくつかのグラフビズツールがあります。https://graphviz.gitlab.io/_pages/pdf/dot.1.pdfを参照してください。試してみる価値があります。 – qneill

答えて

9

私にはあなたの出力は大丈夫に見えます。 TimedOutFailedはもちろん、右端にはWorkingから行くエッジがあるため、すべての方法があります。つまり、dotがベストだと思いますし、グラフビズのレイアウトを調整するための調整ができますが、特定のグラフレイアウトを作成してすべてをコントロールしたい場合は、他のツールを使用する方が良いと思います。

私は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"  ]; 
} 

graphviz output

あなたはまた、エッジの開始と終了を制御するためにポートを使用することによって改善することがあります。その結果、私には良く見ていない - 私はまた、エッジコンセントレータを追加しました。を揃える行番号除いて(最終的に私はうまく利用して、私のテキストエディタのカラムモードを置くために許可されている)と、あなたのファイルがに正常に見える:奇妙なあなたのドットファイルで物事に関するご質問については

私。私は可能な限り同様に(グラフのプロパティ、ノードリスト、グループ化、エッジ)、私のドットファイルを構造化します。ノードの最初の出現順序が最終レイアウトに影響を与える可能性があることにご注意ください。

+0

これを試して私にいくつかの提案をしてくれてありがとう。質問をいくつかの結果で更新しました。私はこれがまだ完全な解決策ではないと思うので、私が探しているものを達成するために私の側からもう少し実験をするでしょう。 –

関連する問題