如何在 Graphviz 中格式化边缘标签?
How to format edge labels in Graphviz?
我创建了一个 graphviz
图来可视化决策树。现在我想在图形的所有边上添加标签(例如 True
、False
)。
我使用正则表达式来操作 .dot
文件,手动添加标签 True
和 False
。生成以下文件
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 位置。
参见:
- https://www.graphviz.org/doc/info/attrs.html#k:escString
- https://www.graphviz.org/doc/info/shapes.html#html
用于显式定位
- https://www.graphviz.org/faq/#FaqDotWithCoords
- https://www.graphviz.org/doc/info/attrs.html#d:lp(忽略“只写评论”)
示例:
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>>]
}
我创建了一个 graphviz
图来可视化决策树。现在我想在图形的所有边上添加标签(例如 True
、False
)。
我使用正则表达式来操作 .dot
文件,手动添加标签 True
和 False
。生成以下文件
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 位置。
参见:
- https://www.graphviz.org/doc/info/attrs.html#k:escString
- https://www.graphviz.org/doc/info/shapes.html#html
用于显式定位
- https://www.graphviz.org/faq/#FaqDotWithCoords
- https://www.graphviz.org/doc/info/attrs.html#d:lp(忽略“只写评论”)
示例:
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>>]
}