web-dev-qa-db-ja.com

GraphVizランクレイアウトで左から右へのノードの順序を強制するにはどうすればよいですか?

GraphVizでプロセスのコレクションを視覚化しています。各プロセスは、プログラム順にいくつかの読み取りまたは書き込み操作で構成されます。当然、各プロセスに対して左から右の順序で操作を配置することが望ましいです。

GraphViz(バージョン2.28)を使用すると、私のコードは次のようになります。

digraph G 
{
ranksep = 1.0; size = "10,10";
{ 
    node [shape = plaintext, fontsize = 20];
    0 -> 1 -> 2 -> 3 -> 4;
}
node [shape = box];
{rank = same;0;wy1;rf1;rc1;rz1;ry1;ra1;rb1;rx2;}
{rank = same;1;wf1;}
{rank = same;2;wx2;wc1;}
{rank = same;3;wf2;wz2;wx3;wa1;}
{rank = same;4;wz1;wy2;wx5;wb1;}
wy1 -> rf1;
rf1 -> rc1;
rc1 -> rz1;
rz1 -> ry1;
ry1 -> ra1;
ra1 -> rb1;
rb1 -> rx2;
wx2 -> wc1;
wf2 -> wz2;
wz2 -> wx3;
wx3 -> wa1;
wz1 -> wy2;
wy2 -> wx5;
wx5 -> wb1;
wf1 -> rf1[color = blue];
wc1 -> rc1[color = blue];
wz1 -> rz1[color = blue];
wy1 -> ry1[color = blue];
wa1 -> ra1[color = blue];
wb1 -> rb1[color = blue];
wx2 -> rx2[color = blue];

// W'WR Order:
wx3 -> wx2[style = dashed, color = red];

// W'WR Order:
wx5 -> wx2[style = dashed, color = red];
}

評判が低すぎる出力画像を投稿することは許可されていません。コードを実行できれば、結果はそれほど満足のいくものではないことがわかります。具体的には、GraphVizレイアウトアルゴリズムは、(理想的な)順序「wf2-> wz2-> wa1-> wx3」を「wx3、wf2、wz2、wa1」に再配置しました。したがって、私の問題は次のとおりです。

私の問題:ランク環境で左から右ノードの順序を強制する方法は?

このサイトを探索して、私はいくつかの同様の問題と潜在的な解決策を見つけました。 しかし、私の特定の例では機能しませんでした:

  • Graphviz .dotノードの順序constraint = falseオプションにより、私のPDF画像が悪化しました。--を確認しました。 ドットユーザーズマニュアル これは次のように述べています:

    ランクの割り当て中、エッジのヘッドノードはテールノードよりも高いランクになるように制約されます。ただし、Edgeにconstraint = falseがある場合、この要件は強制されません。

    上記のステートメントに基づいて、(私は推測します)constraint = falseオプションは、同じランクではなく、異なるランク間で有効になります。

  • Graphviz ---ランダムなノード順序とラベルを通過するエッジ :驚いたことに、constraint = falseオプションは「有限状態マシン」に大いに役立ちました同じランク。繰り返しますが、それは私をトラブルから救うものではありません。

  • graphviz:ノードの順序を維持したままの円形レイアウト :プロセスグラフは、ノードの数とエッジの両方で動的です。したがって、ノードの絶対位置を使用することは魅力的ではないかもしれません(多くのエッジ交差を引き起こすために?)。

    提案をありがとう。そして、実行可能コードは非常に高く評価されます。

dot file

21
hengxin
    digraph G 
{
ranksep = 1.0; size = "10,10";
{ 
    node [shape = plaintext, fontsize = 20];
    0 -> 1 -> 2 -> 3 -> 4;
}
node [shape = box];
{
rank = same;
0->wy1->rf1->rc1->rz1->ry1->ra1->rb1->rx2 [color=white];
rankdir=LR;
}
{
rank = same;
1->wf1[color=white];
rankdir=LR
}
{
rank = same;
2->wx2->wc1[color=white];
rankdir=LR;
}
{
rank = same;
3->wf2->wz2->wx3->wa1[color=white];
rankdir=LR;
}
{
rank = same;
4->wz1->wy2->wx5->wb1[color=white];
rankdir=LR;
}
wy1 -> rf1;
rf1 -> rc1;
rc1 -> rz1;
rz1 -> ry1;
ry1 -> ra1;
ra1 -> rb1;
rb1 -> rx2;
wx2 -> wc1;
wf2 -> wz2;
wz2 -> wx3;
wx3 -> wa1;
wz1 -> wy2;
wy2 -> wx5;
wx5 -> wb1;
wf1 -> rf1[color = blue];
wc1 -> rc1[color = blue];
wz1 -> rz1[color = blue];
wy1 -> ry1[color = blue];
wa1 -> ra1[color = blue];
wb1 -> rb1[color = blue];
wx2 -> rx2[color = blue];

// W'WR Order:
wx3 -> wx2[style = dashed, color = red];

// W'WR Order:
wx5 -> wx2[style = dashed, color = red];
}

正しく問題が発生したかどうかはわかりませんが、これを使用してみて、必要に応じてコメントしてください。ノードを正しくランク付けするために非表示のエッジを追加し、rankdirを使用して左右のレイアウトを使用しました。

18