Graphviz节点位置控制:节点垂直层级与水平间距调整问题
Graphviz 布局问题解答
问题1:使节点"11"与节点"12"处于同一垂直层级
要让两个节点处于同一垂直层级(同秩),可以使用rank=same子图强制指定节点的秩。根据需求不同,有两种实现方式:
方式1:保留层级逻辑,仅让节点同层
调整边的连接关系,让12和11同属一个层级,同时保证分支的流向合理:
digraph EXAMPLE { splines="line"; node[shape=circle, fontname="Verdana"]; ranksep=1; SC -> {00, 01} -> {02, 03} -> {FC} SU -> {13, 12, 10} {rank=same; 12; 11;} {13, 10} -> 11 -> FU SD -> {22} -> {23, 21, 20} -> {FD} ST -> {31, 32} -> {33, 30} -> {FT} S -> {SC ; SU ; SD ; ST} {FC ; FU ; FD ; FT} -> F }
方式2:保留原有边,强制节点同层
直接添加rank=same子图,12到11的边会变为同层的横向边:
digraph EXAMPLE { splines="line"; node[shape=circle, fontname="Verdana"]; ranksep=1; SC -> {00, 01} -> {02, 03} -> {FC} SU -> {13, 12, 10} -> {11} -> {FU} {rank=same; 12; 11;} SD -> {22} -> {23, 21, 20} -> {FD} ST -> {31, 32} -> {33, 30} -> {FT} S -> {SC ; SU ; SD ; ST} {FC ; FU ; FD ; FT} -> F }
问题2:让节点"SC"、"SU"、"SD"和"ST"之间的水平间距保持一致
默认布局中,这四个节点的间距会因各自分支的节点数量差异被自动调整,可通过以下两种方式实现均匀间距:
方法1:强制同秩+统一节点间距
将四个节点放入rank=same子图,同时设置nodesep属性精确控制水平间距:
digraph EXAMPLE { splines="line"; node[shape=circle, fontname="Verdana"]; ranksep=1; nodesep=0.8; # 可根据需求调整数值 SC -> {00, 01} -> {02, 03} -> {FC} SU -> {13, 12, 10} -> {11} -> {FU} SD -> {22} -> {23, 21, 20} -> {FD} ST -> {31, 32} -> {33, 30} -> {FT} {rank=same; SC; SU; SD; ST;} S -> {SC ; SU ; SD ; ST} {FC ; FU ; FD ; FT} -> F }
方法2:使用group属性自动优化
为四个节点设置相同的group属性,布局引擎会自动平衡同组节点的间距:
digraph EXAMPLE { splines="line"; node[shape=circle, fontname="Verdana"]; ranksep=1; SC [group=S_branch]; SU [group=S_branch]; SD [group=S_branch]; ST [group=S_branch]; SC -> {00, 01} -> {02, 03} -> {FC} SU -> {13, 12, 10} -> {11} -> {FU} SD -> {22} -> {23, 21, 20} -> {FD} ST -> {31, 32} -> {33, 30} -> {FT} S -> {SC ; SU ; SD ; ST} {FC ; FU ; FD ; FT} -> F }
内容的提问来源于stack exchange,提问作者Fco.Jav.Y
相关产品推荐
相关产品推荐

