【问题标题】:Graphviz --- edge label too close to another edgeGraphviz --- 边缘标签太靠近另一个边缘
【发布时间】:2020-04-08 09:19:40
【问题描述】:

我有以下代码,结果如下图。如您所见,边缘和边缘标签周围有点拥挤,尤其是在“^a”周围。什么是创建更多空间的最佳方法,以便人们可以清楚地看到哪个标签属于哪个边缘?

digraph finite_state_machine {                                                                                                                                                                                  
    pad=0.2;
    {
        rank=same;
        node [shape = point, style = invis]; q_0;
        node [shape = doublecircle, style = solid]; q_5;
        node [shape = circle];
        q_1 [ label = <<i>q<sub>1</sub></i>> ];
        q_2 [ label = <<i>q<sub>2</sub></i>> ];
        q_3 [ label = <<i>q<sub>3</sub></i>> ];
        q_4 [ label = <<i>q<sub>4</sub></i>> ];
        q_5 [ label = <<i>q<sub>5</sub></i>> ];
        q_0 -> q_1;
        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 = <<i>a</i>> ];
        q_3 -> q_4 [ label = <<i>^a</i>> ];
        q_3 -> q_4 [ label = <&epsilon;>, constraint=false ];
        q_4 -> q_3 [ label = <&epsilon;>, constraint=false ];
        q_4 -> q_5 [ label = <<i>b</i>> ];
    }
}

【问题讨论】:

  • 我认为您可以在定义边缘时尝试设置minlen=5。例如 - q_1 -&gt; q_2 [ minlen=5,label = &lt;&amp;epsilon;&gt;, constraint=false ];
  • 效果不太好。我在 q4 到 q3 的 epsilon 边缘上进行了尝试。 egde 变长了,增加了节点之间的距离,但实际上并没有变高,因此问题仍然存在。
  • 您可以使用端口来进一步弯曲边缘,如:stackoverflow.com/questions/18515529/…

标签: graphviz


【解决方案1】:

Graphviz 中没有 attribute 来调整边缘标签周围的边距/填充。您可能最接近您需要的效果是使用\n 在标签上方/下方引入空白行以强制空格。

显然,这不会自动扩展到任何东西。

或者,您可以尝试使用ranksep 属性强制添加一些额外的空间。

【讨论】:

    【解决方案2】:

    如果xlabel 不能解决问题,那么将标签包装在表格中有时可以解决问题。例如:

    q_1 -> q_2 [ label = <<table cellpadding="10" border="0" cellborder="0">
                            <tr><td>&epsilon;</td></tr>
                          </table>>, 
                 constraint = false ];
    

    要在一侧添加比另一侧更多的空间,您可以添加一个空单元格。然后代码很快变得(更)不可读,但您可以使用简单的 sed 脚本来预处理您的点文件。

    【讨论】:

      【解决方案3】:

      我知道这是一个老问题,但如果这是您正在寻找的,下面的这种方法也可能会有所帮助。见下图。 我在您的代码中添加了以下内容:

      • minlen=2(扩展节点之间的间隙)

      • tailport=n/s(将箭头尾部的位置更改为北/南)

      • headport=n/s(将头部位置更改为向北或向南的箭头)

      
      digraph finite_state_machine {                                                                                                                                                                                  
          pad=0.2;
          {
              rank=same;
              node [shape = point, style = invis]; q_0;
              node [shape = doublecircle, style = solid]; q_5;
              node [shape = circle];
              q_1 [ label = <<i>q<sub>1</sub></i>> ];
              q_2 [ label = <<i>q<sub>2</sub></i>> ];
              q_3 [ label = <<i>q<sub>3</sub></i>> ];
              q_4 [ label = <<i>q<sub>4</sub></i>> ];
              q_5 [ label = <<i>q<sub>5</sub></i>> ];
              q_0 -> q_1;
              q_1 -> q_2 [ label = "." ];
              q_1 -> q_2 [ label = <&epsilon;>, constraint=false, minlen=2, tailport=n, headport=n];
              q_2 -> q_1 [ label = <&epsilon;>, constraint=false, minlen=2, tailport=s, headport=s];
              q_2 -> q_3 [ label = <<i>a</i>> ];
              q_3 -> q_4 [ label = <<i>^a</i>> ];
              q_3 -> q_4 [ label = <&epsilon;>, constraint=false, minlen=2, tailport=n, headport=n];
              q_4 -> q_3 [ label = <&epsilon;>, constraint=false, minlen=2, tailport=s, headport=s];
              q_4 -> q_5 [ label = <<i>b</i>> ];
          }
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 2014-06-12
      • 2018-06-04
      • 2020-02-09
      相关资源
      最近更新 更多