3

次のドットファイルがあります。

digraph finite_state_machine {
    {
        rank=same;
        node [shape = doublecircle]; q_5;
        node [shape = circle];
        q_1 -> q_2 [ label = "." ];
        q_1 -> q_2 [ label = "\epsilon" ];
        q_2 -> q_1 [ label = "\epsilon" ];
        q_2 -> q_3 [ label = "a" ];
        q_3 -> q_4 [ label = "^\wedge a" ];
        q_3 -> q_4 [ label = "\epsilon" ];
        q_4 -> q_3 [ label = "\epsilon" ];
        q_4 -> q_5 [ label = "b" ];
    }
}

ノードは記載されている順序で表示されるという印象を受けました。しかし、順番は私にはランダムに思えます。左から右へ、添え字の順番にしたいです。また、エッジがラベルを通過しますが、どうすれば回避できますか?

これは現在の画像です: 電流出力

4

2 に答える 2

7

Graphviz は、出現順ではなく、互いの間のエッジに応じてノードをレイアウトします。エッジがノードの位置に影響を与えないようにしたい場合は、 を追加してこれを行うことができますconstraint=false

したがって、このグラフ:

digraph finite_state_machine {
  pad=0.2;
    {
        rank=same;
        node [shape = doublecircle]; q_5;
        node [shape = circle];
        q_1 -> q_2 [ label = "." ];
        q_1 -> q_2 [ label = "\epsilon", constraint=false ];
        q_2 -> q_1 [ label = "\epsilon", constraint=false ];
        q_2 -> q_3 [ label = "a" ];
        q_3 -> q_4 [ label = "^\wedge a" ];
        q_3 -> q_4 [ label = "\epsilon", constraint=false ];
        q_4 -> q_3 [ label = "\epsilon", constraint=false ];
        q_4 -> q_5 [ label = "b" ];
    }
}

あなたを得るでしょう:

graphviz 出力の有限状態マシン

pad一部のラベルが切り取られないように追加する必要がありました。

于 2012-10-05T15:33:37.090 に答える
2

これがアイデアの1つです。

1) 次のコマンドを使用して、ノードの配置中にドットが使用する位置を確認します。

dot filename.dot

2)生成された出力の各ノードのpos属性に注意してください。次に、コードで好みに応じて値を変更します。これは、例の変更されたドット コードです。

digraph finite_state_machine {
{
    rank=same;
    node [shape = circle];
    q_1[pos="30"];
    q_2[pos="130"];
    q_3[pos="230"];
    q_4[pos="330"];
    node [shape = doublecircle]; 
    q_5 [pos="430"];
    q_1 -> q_2 [ label = "." ];
    q_1 -> q_2 [ label = "\epsilon" ];
    q_2 -> q_1 [ label = "\epsilon" ];
    q_2 -> q_3 [ label = "a" ];
    q_3 -> q_4 [ label = "^\wedge a" ];
    q_3 -> q_4 [ label = "\epsilon" ];
    q_4 -> q_3 [ label = "\epsilon" ];
    q_4 -> q_5 [ label = "b" ];
}

}

3) もう一度ドットを実行して、今度は出力ファイルを生成します。

結果はここで見ることができます:

Graphviz の出力

于 2012-10-05T15:34:40.047 に答える