【问题标题】:Graphviz---random node order and edges going through labelsGraphviz---随机节点顺序和通过标签的边
【发布时间】:2012-09-26 14:35:50
【问题描述】:

我有以下点文件:

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

我的印象是节点会按照它们被提及的顺序出现。但对我来说,顺序似乎是随机的。我希望从左到右的顺序是下标的顺序。另外,边缘会穿过标签,我该如何避免呢?

这是当前图像:

【问题讨论】:

    标签: graphviz


    【解决方案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) 再次运行 dot,这次是生成输出文件。

    结果可以在这里看到:

    【讨论】:

      【解决方案2】:

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

      会得到你:

      我必须添加pad,以免某些标签被截断。

      【讨论】:

      • 谢谢,但是,我这样做了,我的边缘都进入或低于节点线,没有超过它。像这样i.imgur.com/1Xj8n.png你的看起来更好。
      • 你试过这个确切的脚本吗?什么版本的graphviz?
      • 是的,确切的脚本。版本 2.26.3 (20100126.1600)
      • 我用的是2.28版本,你可以试试升级。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 2020-06-19
      • 2019-01-27
      • 1970-01-01
      • 2010-10-24
      • 2016-12-12
      相关资源
      最近更新 更多