45

グラフを次のようにしたいと思います。

しかし、私はこれしか得られません:

問題は、でrankdir 動作しないことですsubgraph。では、それをエミュレートする方法は?

コード:

digraph G {
    node [shape = circle]
    0 [style = invis]

    0 -> "0A"

    subgraph clusterA {
        label=A
        "0A"
        "1A"
        "2A" -> "0A" [label=•]
    }

    subgraph clusterB {
        label=B
        "0B"
        "1B"
        "2B" -> "0B" [label=•]
    }

        subgraph clusterC {
        label=C
        "0C"
        "1C"
        "2C" -> "0C" [label=•]
    }

    subgraph clusterD {
        label=D
        "0D"
        "1D"
        "2D" -> "0D" [label=•]
    }

    subgraph clusterE {
        label=E
        "0E"
        "1E"
        "2E" -> "0E" [label=•]
    }

    subgraph clusterF {
        label=F
            {node [shape = doublecircle] "0F" "1F"}
        "2F" -> "0F" [label=•]
    }

    "0A" -> "1B" [label=a]
    "1A" -> "2B" [label=a]
    "0B" -> "1C" [label=b]
    "1B" -> "2C" [label=b]
    "0C" -> "1D" [label=c]
    "1C" -> "2D" [label=c]
    "0D" -> "1E" [label=d]
    "1D" -> "2E" [label=d]
    "0E" -> "1F" [label=e]
    "1E" -> "2F" [label=e]
}
4

5 に答える 5

57

通常、特定のグラフ レイアウトの再現は、次の方法で実現できます。

  • 非表示のノードとエッジ
  • ランク制約

これが私があなたのグラフを再現した方法です-または少なくともその一部です:

digraph g {
    rankdir="LR";
    node[shape = circle, fontsize=14];
    fontsize=18;
    labeljust="l";

    edge[style=invis, fontsize=12];

    { rank=same;
        0 [style = invis];
        01 [style = invis];
        02 [style=invis];
        0 -> 01 -> 02;
    }

    subgraph clusterA {
        "0A" -> "1A" -> "2A";
        "2A" -> "0A" [label=".", constraint=false, style=solid];
        label="A";
    }

    subgraph clusterB {
        "0B" -> "1B" -> "2B";
        "2B" -> "0B" [label=".", constraint=false, style=solid];
        label="B";
    }

    subgraph clusterC {
        "0C" -> "1C" -> "2C";
        "2C" -> "0C" [label=".", constraint=false, style=solid];
        label="C";
    }

    0 -> "0A"[style=solid];
    01 -> "0B"[style=invis];
    02 -> "0C"[style=invis];

    // edges between clusters
    edge[constraint=false, style=solid];
    "0A" -> "1B" [label=a]
    "1A" -> "2B" [label=a]
    "0B" -> "1C" [label=b]
    "1B" -> "2C" [label=b]
}

このソリューションはあまり直感的ではありません。これを達成するためのいくつかのポイント:

  • グラフの方向と実際には一致しませんが、rankdir="LR"よりもエッジが良いものを選択しましたTB
  • クラスターを左に揃えるために、上位ランクのノード (0、01、02) には非表示のノードとエッジが使用されます。
  • (不可視の) トップ ノードは同じランクに強制され、不可視のエッジによってリンクされます。これにより、各ノードにリンクされたクラスターが正しい順序で表示されるようになります。

結果は次のとおりです。

グラフビズ出力

于 2011-10-16T21:34:26.927 に答える
2

constraint=false を使用すると、サブグラフ内のノードが希望どおりになるはずです http://www.graphviz.org/doc/info/attrs.html#d:constraint

subgraph clusterB {
    label=B
    "0B"
    "1B"
    "2B" -> "0B" [constraint=false label=•]
}

その後、サブグラフが思い通りに並んでいないことがわかります。このようなものはそれを解決することができます。

"0A" -> "0B" -> "0C" -> "0D" -> "0E" [weight=999 style=invis];
于 2011-10-16T16:24:26.163 に答える