Graphviz嵌套子图节点位置调整:如何将节点移出子图框
解决方法:调整节点所属层级,无需虚拟节点
嘿,这个问题其实很好解决——核心原因就是你把18节点放在了cluster_0子图内部,所以Graphviz自动把它归到了绿色边框里。不用搞虚拟节点的话,直接调整节点的层级就行,步骤超简单:
- 把
18节点从subgraph cluster_0中移出,放到主图层级下,这样它就不会被cluster_0的边框包含。 - 保留
rank约束确保位置不变:在主图里维持{ rank=same; 4, 18 },保证18和4处于同一水平位置,和原布局一致。 - 保留
12 -- 18的边,维持二叉树的结构关联。
修改后的完整Graphviz代码
graph G { graph [ranksep="0.25", nodesep="0.25"] rankdir = TB; node [shape=ellipse, style=filled, fillcolor="#0068B4", color=white, fontcolor=white, penwidth=10] edge [arrowtail="none"] // 把18移到主图层级 18; subgraph cluster_0 { node [fillcolor="#99CC00"] color="#99CC00" style=filled fillcolor=white fontcolor="#99CC00" label="12 is the root of\n26's left child" subgraph cluster_01 { node [fillcolor="#00B0F0"] color="#00B0F0" fontcolor="#00B0F0" style=filled fillcolor=white label="4 is the root of \n12's left child " 7 [fillcolor=white] 4 -- 13 4 -- 7 [style=invisible] 7 -- 13 [style=invisible] { rank=same; 7, 13 } { rank=same; 4 } } 12 -- 4 { rank=same; 12 } } subgraph cluster_1 { node [fillcolor="#C00000"] color="#C00000" style=filled fillcolor=white fontcolor="#C00000" label="32 is the root of\n26's right child" 35 [fillcolor=white] 32 -- 38 32 -- 35 [style=invisible] 35 -- 38 [style=invisible] { rank=same; 32 } { rank=same; 35, 38 } } // 主图里设置rank约束,连接12和18 { rank=same; 4, 18 } 12 -- 18 26 -- {12, 32} { rank=same; 26 } }
效果说明
调整后,cluster_0的绿色边框只会包裹12和它的左子树(cluster_01),18节点会出现在边框外侧,和4保持同一水平层级,完美符合你想要的二叉树结构,而且完全不需要额外的虚拟不可见节点。
内容的提问来源于stack exchange,提问作者Christian B.
相关产品推荐
相关产品推荐

