Graphviz --- 边标签太靠近另一条边

13

我有以下代码,结果显示在下面的图像中。您可以看到,在边缘和边缘标签周围有一点拥挤,特别是在“^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>> ];
    }
}

这里输入图像描述


2
我认为你可以尝试在定义边缘时设置minlen=5。例如- q_1 -> q_2 [ minlen=5,label = <&epsilon;>, constraint=false ]; - Raj
那个方法并不是很好用。我在从q4到q3的epsilon边上尝试了一下,边变得更长了,增加了节点之间的距离,但实际上并没有提高,因此问题仍然存在。 - oskarkv
1
你可以使用端口来更加弯曲边缘,例如:https://dev59.com/VWMl5IYBdhLWcg3wTlcl#18698294 - Richard EB
3个回答

13

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

显然,这对于任何自动化都不会扩展。

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


9
如果xlabel不能解决问题,那么将标签包装在表格中有时可以解决问题。例如:
q_1 -> q_2 [ label = <<table cellpadding="10" border="0" cellborder="0">
                        <tr><td>&epsilon;</td></tr>
                      </table>>, 
             constraint = false ];

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

5

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

  • minlen=2 (将节点之间的空隙扩大为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>> ];
    }
}

image


这相当于Richard EB的明确端口建议Graphviz:将边缘标签放在另一侧(II) - Pekka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接