如何使dot、gvpack、neato生成适配标题的无重叠图簇边界框?
问题描述
希望通过dot、gvpack和neato程序化绘制图形:先通过库生成图结构并写入dot格式文件,再打包所有图。每个图的cluster包含不可省略的标题label,但有时label过宽,当前生成结果存在边界框无法完整容纳标题、图边界框重叠的问题,需要配置工具实现:每个图的边界框足够大以完整显示标题,且排列时边界框不重叠。
最小可复现示例(MWE)
文件tree_04_00.raw
graph { layout = neato subgraph cluster_0 { label = "idx= 0, centre=(0,1), centroid= (0,1)"; nd_0 [label= "0"]; nd_1 [label= "1"]; nd_2 [label= "2"]; nd_3 [label= "3"]; nd_0 -- nd_1; nd_0 -- nd_3; nd_1 -- nd_2; } }
文件tree_04_01.raw
graph { layout = neato subgraph cluster_1 { label = "idx= 1, centre=(0), centroid= (0)"; nd_4 [label= "0"]; nd_5 [label= "1"]; nd_6 [label= "2"]; nd_7 [label= "3"]; nd_4 -- nd_5; nd_4 -- nd_6; nd_4 -- nd_7; } }
生成命令
# dot for each .raw file $ dot -Tdot tree_04_00.raw > tree_04_00.dot $ dot -Tdot tree_04_01.raw > tree_04_01.dot # now pack all the graphs $ gvpack -array_it20 tree_04_*.dot > trees_04.dot # now run neato $ neato -n2 -Tsvg trees_04.dot > trees_04.svg
使用版本
- neato - graphviz version 2.43.0 (0)
- dot - graphviz version 2.43.0 (0)
- gvpack (unknown version)
- gvpr version 2.43.0 (0)
解决方案
可以通过调整Graphviz属性和工具参数实现需求,具体步骤如下:
1. 让cluster边界框完整容纳标题label
在每个cluster的定义中添加margin属性,增加内边距,确保label有足够显示空间。可根据label长度调整数值(单位为点):
subgraph cluster_0 { label = "idx= 0, centre=(0,1), centroid= (0,1)"; margin = 20; # 增大内边距,适配长label labelloc = t; # 指定label在cluster顶部(可选,优化排版) labeljust = c; # 指定label居中(可选,优化排版) # 其余节点和边定义... }
如果label过长,还可以手动添加换行符\n拆分文本,减少横向宽度:
label = "idx= 0, centre=(0,1)\ncentroid= (0,1)";
2. 确保打包后边界框不重叠
- 调整
gvpack的间距参数:使用-g设置图之间的间距(单位为点),数值越大,图之间的空隙越宽,避免重叠。同时可根据图的大小调整-array_it后的每行图数量:gvpack -g 40 -array_it10 tree_04_*.dot > trees_04.dot - 优化单个图的边界计算:因为原始文件指定了
layout=neato,直接用neato生成单个图的dot文件,能更准确计算包含label的边界框,替代原来的dot命令:$ neato -Tdot tree_04_00.raw > tree_04_00.dot $ neato -Tdot tree_04_01.raw > tree_04_01.dot
3. 完整优化后的命令流程
# 用neato生成带准确边界的单个图dot文件 $ neato -Tdot tree_04_00.raw > tree_04_00.dot $ neato -Tdot tree_04_01.raw > tree_04_01.dot # 打包时设置图间距,避免重叠 $ gvpack -g 40 -array_it20 tree_04_*.dot > trees_04.dot # 最终渲染输出 $ neato -n2 -Tsvg trees_04.dot > trees_04.svg
内容的提问来源于stack exchange,提问作者llualpu
相关产品推荐
相关产品推荐

