web-dev-qa-db-ja.com

graphvizのドットのレベルノードの順序をどのように制御できますか?

木をバックボーンとするグラフがあります。たとえば、ノードAに子B、C、Dがあるとします。グラフがトップダウンで描画されていると仮定すると、Aは1つのレベルになり、次にB、C、Dになります。graphvizを強制的に実行したいと思います。それらをランク内でB、C、Dの順に配置します。これは可能ですか?もしそうなら、どのように?

A、B、C、Dしかない場合は、入力ドットファイルにB、C、Dの順に配置するだけでこの効果を得ることができます。ただし、B、C、D以外のエッジがある場合、順序が乱れることがあります。それは私が避けたいことです。

enter image description here

19

これは、図のように「見えない」エッジで実現できます。それがどのように機能するかを説明するコメントに注意してください。

digraph test{

// make invisible ranks
rank1 [style=invisible];
rank2 [style=invisible];

// make "invisible" (white) link between them
rank1 -> rank2 [color=white];

// declare nodes all out of desired order
A -> D;
A -> B;
A -> C;
A -> E;

// even these new connection don't mess up the order
B -> F -> G;
C -> F -> G;

{
rank = same;
// Here you enforce the desired order with "invisible" edges and arrowheads
rank2 -> B -> C -> D -> E [ style=invis ];
rankdir = LR;
}
}

enter image description here

16
TomServo

@TomServoの回答(「ランク」に苦労している人のため)を記入するのを助けるために、私は見えないエッジを見えるようにしました:

After adding <code>rank1</code> and <code>rank2</code>.

17
jkmacc