如何在 Graphviz 中格式化边缘标签?

How to format edge labels in Graphviz?

我创建了一个 graphviz 图来可视化决策树。现在我想在图形的所有边上添加标签(例如 TrueFalse)。

我使用正则表达式来操作 .dot 文件,手动添加标签 TrueFalse。生成以下文件

digraph Tree {
node [shape=box, style="rounded", color="black", fontname=helvetica] ;
edge [fontname=helvetica] ;
0 [label="s5 smaller
or equal to 0.0"] ;
1 [label="bmi smaller
or equal to 0.0"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
3 [label="value = 110.6"] ;
1 -> 3 [headlabel="True"] ;
4 [label="value = 161.0"] ;
1 -> 4 [headlabel="False"] ;
2 [label="bmi smaller
or equal to 0.0"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
5 [label="value = 174.0"] ;
2 -> 5 [headlabel="True"] ;
6 [label="value = 237.7"] ;
2 -> 6 [headlabel="False"] ;
}

这会产生以下情节:

但是,标签没有很好地排列(箭头切断了标签),我想相应地格式化文本。有没有一种方法可以在 graphviz 地块中完成? 谢谢!

您可以通过向标签文本添加空格来优化标签放置,如下所示:

digraph Tree {
node [shape=box, style="rounded", color="black", fontname=helvetica] ;
edge [fontname=helvetica] ;
0 [label="s5 smaller
or equal to 0.0"] ;
1 [label="bmi smaller
or equal to 0.0"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
3 [label="value = 110.6"] ;
1 -> 3 [headlabel="True  "] ;
4 [label="value = 161.0"] ;
1 -> 4 [headlabel="False  "] ;
2 [label="bmi smaller
or equal to 0.0"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
5 [label="value = 174.0"] ;
2 -> 5 [headlabel="True  "] ;
6 [label="value = 237.7"] ;
2 -> 6 [headlabel="False    "] ;
}

给予:

[更完整(和混乱)的答案]
有多个级别的标签格式:

  • 可以插入空格影响X位置
  • 您可以插入实际的换行符或 \n 来影响 Y 位置
  • 您可以使用 \l\r 强制左对齐或右对齐
  • 您可以使用(伪)HTML 字符串来添加更多格式组合
  • 或者您可以通过设置或修改节点或边的 lp 属性来显式设置 X 和 Y 位置。

参见:

用于显式定位

示例:

digraph labels {
  a [label=a]
  b [label="b\n\n\n"]
  c [label="       c"]
  d [label="d\n\nD"]
  e [label=<<B>e</B>>]
  f
  r [label=<<table><tr><td>r</td></tr></table>>]
  s
  
  a->b [label=a123]
  b->c [label="b123\n\n\n b321"]
  c->d [label="       c123"]
  d->e [label=" d123\n\nD123"]
  e->f [label=<<I>  e123</I>>]

  r->s [label=<<table><tr><td>r123</td><td>6</td></tr><tr><td></td><td>r321</td></tr></table>>]
}