Graphviz LR方向下子图垂直定位顺序问题求助
Graphviz子图垂直排列顺序固定问题
我用Graphviz的Python库绘制流程图,节点和子图的顺序非常关键,但相同代码每次渲染结果都不一致。已经设置了rankdir=LR,也尝试给垂直边设置高weight,但还是没法固定cluster_1、cluster_2这类子图的垂直排列顺序,求解决思路。
附上代码:
digraph G { graph [rankdir=LR] subgraph cluster_0 { subgraph cluster_start { start; } subgraph cluster_1 { style=filled; color=lightgrey; node [style=filled,color=white]; A00; A0; A1; A2; A3; A00 -> A0; A00 -> A1; A1 -> A2; A0 -> A3; label = "process #1"; } subgraph cluster_2 { node [style=filled]; B00; B0; B1; B2; B3; B00 -> B0; B00 -> B1; B1-> B3; B0 -> B2; label = "process #2"; } subgraph cluster_end { end; } start -> A00 [constraint=false]; A00 -> B00 [constraint=false]; B00-> end [constraint=false]; } }
解决思路
强制子图rank层级:在cluster_0中给需要固定顺序的子图添加rank约束,比如要让cluster_1在cluster_2上方,可以添加一条带约束的隐形边:
cluster_1 -> cluster_2 [style=invisible, constraint=true];或者用rank分组明确层级:
{rank=source; cluster_start;} {rank=same; cluster_1;} {rank=same; cluster_2;} {rank=sink; cluster_end;}固定布局随机种子:Graphviz默认用随机种子处理布局歧义,导致每次结果不同。在graph属性里设置固定随机种子:
graph [rankdir=LR, randomseed=42]数值可以随便选,只要固定就行。
恢复边的约束关系:你给
start->A00、A00->B00这些边加了constraint=false,等于告诉Graphviz不用考虑这些边的层级关系,这是导致顺序混乱的核心原因之一。去掉constraint=false,让Graphviz根据边的依赖来确定节点和子图的顺序:start -> A00; A00 -> B00; B00-> end;如果不想显示这些边,改成隐形边即可:
start -> A00 [style=invisible]; A00 -> B00 [style=invisible]; B00-> end [style=invisible];子图order属性:给子图添加
order属性指定处理顺序,比如:subgraph cluster_1 { order=1; // 原内容 } subgraph cluster_2 { order=2; // 原内容 }这个属性配合dot引擎使用,能强制子图的排列优先级。
内容的提问来源于stack exchange,提问作者clementterrien
相关产品推荐
相关产品推荐

