graph - 如何在点中的节点上强制排名?

标签 graph graphviz dot state-machine graph-layout

我有一些相对简单的(自动生成的)graphviz点格式的图。这些显示了通过状态机的路径,但是当我希望图形处于状态顺序时,点有一个令人困惑的习惯,即确定两个节点必须处于同一等级。我已经尝试了很多设置(包括下面列出的:n:sweight),但是我无法说服点将第三状态置于第四状态之上。

我在很多图形中都遇到了这个问题:点内部似乎有些东西决定了,如果两个节点处于同一等级,那会更好,并且没有任何办法可以覆盖它。我什至有代码指定一个节点应该是rank=sink,但是dot决定无论如何都要在其下放置另一个节点。

有没有什么方法可以建议点比其他任何约束更重要?

用于生成图形的代码如下所示:

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

该图当前看起来像这样:

最佳答案

使用“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"];
}

关于graph - 如何在点中的节点上强制排名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1104285/

相关文章:

c++ - Graphviz 的性能

graphviz - 使用点语言在 Graphviz 中压缩有向图

c++ - 如何通过交换边使图强连通

algorithm - 博格板的邻接矩阵

unit-testing - 具有复合条件和短路的圈复杂度

GraphViz:压缩自动生成的图表

python - Pygraphviz 绘制 170 个图形后崩溃

Graphviz 边缘不可辨别/边缘标签被覆盖

graph - 边用 Graphviz 和 Dot 指向边

linux - 如何在 Perl 中找到图形的连通分量?