【问题标题】:How do you force rank on a node in dot?你如何在点中的节点上强制排名?
【发布时间】:2010-11-09 09:51:01
【问题描述】:

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

我在很多图表中都遇到了这个问题:dot 内部似乎有一些东西决定如果两个节点处于同一等级并且没有什么可以覆盖它会更好。我什至有代码指定一个节点应该是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"];
}

图表目前如下所示:

【问题讨论】:

    标签: graph graphviz dot state-machine graph-layout


    【解决方案1】:

    当你想要一个向上的箭头时,从上到下(即向后)写下边缘,然后添加dir=back (https://graphviz.org/docs/attrs/dir/) 使箭头指向向上而不是向下。

    所以而不是:

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

    写:

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

    现在,由于所有边都从 ThirdSTATE 变为 FourthSTATE,因此排名不再模棱两可,Graphviz 将可靠地将 ThirdSTATE 置于 FourthSTATE 之上。

    这通常比使用 constraint=false 更好,因为带有 constraint=false 的边有时会被赋予非常摆动的边(好像它们没有参与图形布局?)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 在 Confluence 流程图宏中,边缘的 constraint=false 属性无效。
      猜你喜欢
      • 2012-10-15
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2016-07-24
      相关资源
      最近更新 更多