13

ソフトウェアのドキュメンテーション ツールとしてメディア ウィキで graphviz を使用しようとしています。

最初に、うまく機能するいくつかのクラス関係を文書化しました。予想通り、すべてが垂直にランク付けされました。

しかし、モジュールの一部は dll であり、ボックスに分けたいと考えていました。ノードをクラスターに追加するとエッジが効きましたが、クラスターには LR ランキング ルールがあるようです。または、クラスターに追加されると、クラスターがグラフの横に表示されるようになったため、ノードの TB ランキングが壊れました。

このグラフは、私がやろうとしていることを表しています。現時点では、cluster1 と cluster2 がcluster0の右側に表示されています。

それらを下に表示したい/必要です。

<graphviz>
digraph d {
    subgraph cluster0 {
      A -> {B1 B2}
      B2 -> {C1 C2 C3}
      C1 -> D;
    }
    subgraph cluster1 {
      C2 -> dll1_A;
      dll1_A -> B1;
    }
    subgraph cluster2 { 
      C3 -> dll2_A;
    }
    dll1_A -> dll2_A;
}
</graphviz>

4

3 に答える 3

13

全体の高さを最小限に抑えるための Dot による試みのレイアウトです。

必要以上にコンパクトなレイアウトになっている理由の 1 つは、dll1_aからB1への逆方向のエッジを使用していることです。クラスターを宛先ノードにできるだけ近づけようとします。このエッジがグラフに影響を与えないようにするには、示されているように上向きのエッジの制約を緩和するか、エッジを順方向に描画し、dir属性を使用して矢印を逆にします。

これは多くのレイアウトに役立ちますが、与えられた例を修正するにはそれだけでは不十分です。Dot がコンパクトなレイアウトを維持しないようにするために、minlen属性をエッジに追加して (ほぼ) 垂直のままにすることができます。これは一般的に計算するのが難しいかもしれませんが、手動で調整されたレイアウトには実用的です。

digraph d {
    subgraph cluster0 {
        A -> {B1 B2}    
        B2 -> {C1 C2 C3}
        C1 -> D;
    }
    subgraph cluster1 {
        C2 -> dll1_A [minlen = 2];
        dll1_A -> B1 [constraint = false];
        /* B1 -> dll1_A [dir = back]; */
    }
    subgraph cluster2 {
        C3 -> dll2_A;
    }
    dll1_A -> dll2_A;
}

レイアウト修正

于 2010-07-25T12:08:56.250 に答える
0

これにより、探しているグラフが生成されます。

digraph d {
  subgraph cluster0 {
    A -> {B1 B2}
    B2 -> {C1 C2 C3}
    C1 -> D;
  }

  subgraph {
    rankdir="TB"
    subgraph cluster1 {
      C2 -> dll1_A;
      dll1_A -> B1;
    }

    subgraph cluster2 {
      C3 -> dll2_A;
    }
  }
  dll1_A -> dll2_A;
}

これが行うことは、レイアウト目的でのみ使用されるサブグラフを作成して、希望する上から下への順序を提供することです。

于 2010-07-21T21:52:12.967 に答える