9

私はgraphvizドット形式の比較的単純な(自動生成された)グラフをいくつか持っています。これらはステートマシンを通るパスを示していますが、グラフをステートオーダーにしたい場合、ドットには2つのノードが同じランクにある必要があると判断するという少し紛らわしい習慣があります。私は多くの設定(:nおよび:sweight以下にリストされているものを含む)を試しましたが、ドットを説得して第3の状態を第4の状態のに配置することはできません。

多くのグラフでこの問題が発生します。2つのノードが同じランクにあり、それをオーバーライドするためにできることは何もない場合に、ドットの内部に何かがあるようです。1つのノードをに指定するコードもありますがrank=sink、ドットはとにかくその下に別のノードを配置することにしました。

他のどの制約よりもノードが整然としていることが重要であることをドットで示す方法はありますか?

グラフの生成に使用されたコードは次のようになります。

digraph {
    ERROR [label="Error"];
    FirstSTATE [label="Initial State" URL="\ref FirstSTATE"];
    FirstSTATE -> SecondSTATE;
    SecondSTATE [label="Second State" URL="\ref SecondSTATE"];
    SecondSTATE -> ThirdSTATE;
    ThirdSTATE [label="Third State" URL="\ref ThirdSTATE"];
    FourthSTATE [label="Fouth State?" shape="diamond"];
    ThirdSTATE:s -> FourthSTATE:n [weight=50];
    FourthSTATE -> FifthSTATE [label="Yes" ];
    FourthSTATE -> ThirdSTATE [label="No"];
    FifthSTATE [label="Fifth State" URL="\ref FifthSTATE"];
    SixthSTATE [label="Sixth State?" shape="diamond"];
    SixthSTATE -> ERROR [label="Yes" ];
    SixthSTATE -> SeventhSTATE [label="No"];
    FifthSTATE -> SixthSTATE;
    SeventhSTATE [label="Seventh State" URL="\ref SeventhSTATE"];
    SeventhSTATE -> EighthSTATE;
    EighthSTATE [label="Eighth State" URL="\ref EighthSTATE"];
    NinthSTATE [label="Ninth State?" shape="diamond"];
    NinthSTATE -> TenthSTATE [label="Yes" ];
    NinthSTATE -> EighthSTATE [label="No"];
    EighthSTATE -> NinthSTATE;
    TenthSTATE [label="Tenth State" URL="\ref TenthSTATE"];
    EleventhSTATE [label="Eleventh State?" shape="diamond"];
    EleventhSTATE -> ERROR [label="Yes" ];
    EleventhSTATE -> TwelfthSTATE [label="No" ];
    TenthSTATE -> EleventhSTATE;
    TwelfthSTATE [label="Twelfth State" URL="\ref TwelfthSTATE"];
}

グラフは現在次のようになっています。 ドットグラフ

4

2 に答える 2

12

「constraint=false」を使用します。

http://www.graphviz.org/doc/info/attrs.html#d:constraint

グラフ内:

FourthSTATE -> ThirdSTATE [label="No" constraint=false] ;

あなたが得るでしょう:

digraph {
    ERROR [label="Error"];
    FirstSTATE [label="Initial State" URL="\ref FirstSTATE"];
    FirstSTATE -> SecondSTATE;
    SecondSTATE [label="Second State" URL="\ref SecondSTATE"];
    SecondSTATE -> ThirdSTATE;
    ThirdSTATE [label="Third State" URL="\ref ThirdSTATE"];
    FourthSTATE [label="Fouth State?" shape="diamond"];
    ThirdSTATE -> FourthSTATE;
    FourthSTATE -> FifthSTATE [label="Yes" ];
    FourthSTATE -> ThirdSTATE [label="No" constraint=false] ;
    FifthSTATE [label="Fifth State" URL="\ref FifthSTATE"];
    SixthSTATE [label="Sixth State?" shape="diamond"];
    SixthSTATE -> ERROR [label="Yes" ];
    SixthSTATE -> SeventhSTATE [label="No"];
    FifthSTATE -> SixthSTATE;
    SeventhSTATE [label="Seventh State" URL="\ref SeventhSTATE"];
    SeventhSTATE -> EighthSTATE;
    EighthSTATE [label="Eighth State" URL="\ref EighthSTATE"];
    NinthSTATE [label="Ninth State?" shape="diamond"];
    NinthSTATE -> TenthSTATE [label="Yes" ];
    NinthSTATE -> EighthSTATE [label="No"];
    EighthSTATE -> NinthSTATE;
    TenthSTATE [label="Tenth State" URL="\ref TenthSTATE"];
    EleventhSTATE [label="Eleventh State?" shape="diamond"];
    EleventhSTATE -> ERROR [label="Yes" ];
    EleventhSTATE -> TwelfthSTATE [label="No" ];
    TenthSTATE -> EleventhSTATE;
    TwelfthSTATE [label="Twelfth State" URL="\ref TwelfthSTATE"];
}
于 2009-07-09T15:22:50.343 に答える
1

上向きの矢印が必要な場合は常に、エッジを上から下(つまり後方)に書き込み、次にdir=backhttps://graphviz.org/docs/attrs/dir/)を追加して、矢印が下向きではなく上向きになるようにします。

したがって、代わりに:

FourthSTATE -> ThirdSTATE [label="No"];

書きます:

ThirdSTATE -> FourthSTATE [dir=back, label="No"];

これで、すべてのエッジがからThirdSTATEに移動するためFourthSTATE、ランクがあいまいでなくなり、Graphvizは確実にThirdSTATE上に配置されますFourthSTATE

constraint=falseのエッジには非常に波状のエッジが与えられることがあるため、これは使用するよりも優れていることがよくありconstraint=falseます(グラフレイアウトに参加していないかのように?)。

于 2021-11-04T15:34:50.110 に答える