如何设置Graphviz有向图的主节点布局为L形?
实现Graphviz有向图主节点L形布局的方案
该需求完全可以实现,核心是通过rank约束、group属性固定主节点排列逻辑,同时调整输入节点的对齐规则即可,以下是具体调整方案:
核心调整点
- 移除原代码中错误的
sink等级子图配置,该配置会打乱主节点的垂直排列逻辑 - 为A1、B1、C1、C2四个主节点设置相同的
group属性,强制Graphviz排列时将这几个节点放在同一条对齐路径上,避免偏移 - 分别为每个主节点的输入节点(x系列节点)设置独立的
rank=same组,保证输入节点都在对应主节点的左侧同一水平层级 - 调高主节点之间的边
weight权重,保证主节点的连接关系优先级最高,不会被输入节点的边打乱布局
完整可运行代码
digraph G { rankdir = TD; // 为主节点设置相同group,保证排列对齐 node [group="main"]; A1; B1; C1; C2; node [group=""]; // 重置group给非主节点 // 主节点连接,增大权重保证布局优先级 A1 -> B1 -> C1 [weight=10]; C1 -> C2 [weight=10]; // 约束C1和C2同水平层级,实现L形的横向延伸 { rank = same; C1; C2; } // 约束各主节点的输入节点和主节点同层级,统一放在左侧 { rank = same; A1; A1_x1; A1_x2; A1_x3; A1_x4; A1_x99; } { rank = same; B1; B1_x1; B1_x2; B1_x3; B1_x4; B1_x99; } { rank = same; C1; C1_x1; C1_x2; C1_x3; C1_x4; C1_x99; } { rank = same; C2; C2_x1; C2_x2; C2_x3; C2_x4; C2_x99; } // 输入节点的连接关系 A1_x1 -> A1 A1_x2 -> A1 A1_x3 -> A1 A1_x4 -> A1 A1_x99 -> A1 B1_x1 -> B1 B1_x2 -> B1 B1_x3 -> B1 B1_x4 -> B1 B1_x99 -> B1 C1_x1 -> C1 C1_x2 -> C1 C1_x3 -> C1 C1_x4 -> C1 C1_x99 -> C1 C2_x1 -> C2 C2_x2 -> C2 C2_x3 -> C2 C2_x4 -> C2 C2_x99 -> C2 }
效果说明
调整后主节点A1、B1、C1会沿垂直方向从上到下排列,C1右侧水平排列C2,正好形成L形的主节点布局,各主节点对应的输入节点统一排列在对应主节点的左侧,和预期参考效果一致。
内容的提问来源于stack exchange,提问作者GreenRover
相关产品推荐
相关产品推荐

