Graphviz设置circo布局无法渲染环形图的问题咨询
Graphviz circo布局无法生成全节点环形结构的解决方法
问题根因
你没有写错配置,这是circo本身的布局逻辑导致的:circo只会对同一个连通分量内的节点做环形排布,不会自动把互不连通的独立节点组强行塞进同一个大环。
你当前的图一共拆成了3个完全独立的连通分量:
- 主分量:JB、ML、VS、AM、JR、EL、LL、VP,节点间存在边互联
- 独立分量1:OO、TK,两个节点仅互相连接,和主分量无任何边
- 独立分量2:JJ、PL,两个节点仅互相连接,和其余所有节点都无连接
渲染时circo会给每个连通分量单独生成环形布局,再把几个小的布局块摆到画布上,自然出不了所有节点排成一个环的效果。这和你用的Graphviz版本、图是有向还是无向没有关系。
修复方案
最稳定的方案是给独立分量加隐藏边,把所有节点串成同一个连通分量,circo就会把所有节点放到同一个环上排布,不需要改动你原本要显示的边。调整后的dot代码如下:
digraph g1 { layout="circo"; node [shape = circle]; JB -> ML [label = "1"]; JB -> VS [label = "2"]; AM -> ML [label = "2"]; AM -> VS [label = "2"]; JR -> EL [label = "2"]; JR -> VS [label = "2"]; LL -> ML [label = "1"]; LL -> VS [label = "1"]; OO -> TK [label = "2"]; JJ -> PL [label = "1"]; VS -> JB [label = "2"]; VS -> JR [label = "2"]; VS -> VP [label = "4"]; // 新增不可见边连通所有独立分量,不会在最终渲染图中显示 TK -> OO [style=invis]; OO -> JJ [style=invis]; JJ -> PL [style=invis]; PL -> VP [style=invis]; }
用你原来的渲染命令circo -Tpng input.gv -o output.png重新渲染就能得到全节点环形的效果。
如果不想加隐藏边,也可以换用neato引擎手动设置节点的极坐标约束,但调整成本比加隐藏边高很多,不推荐。
内容的提问来源于stack exchange,提问作者ZeroOne
相关产品推荐
相关产品推荐

