Graphviz: расположение кластеров слева направо с содержимым сверху вниз

У меня есть приведенный ниже график, и мне нужно, чтобы кластеры/подграфы были расположены слева направо G-H-K-M-N-O-P. Содержимое каждого подграфа в порядке. Как мне это сделать? Я попытался добавить невидимые края, как описано в других вопросах, но это не работает должным образом.

Коробки G/H должны быть в правильном порядке, но играть с весами не получается...

Код ниже отображает изображение внизу. Узлы 00/01 должны быть видимыми, чтобы показать, где порядок перепутан.

digraph {
    {
        edge [ style=invis ];
        rank=same;
        00 [  ];
        01 [  ];
        02 [ style=invis ];
        03 [ style=invis ];
        04 [ style=invis ];
        05 [ style=invis ];
        06 [ style=invis ];
        00 -> 01 -> 02 -> 03 -> 04 -> 05 -> 06 [ weight=1000 ];
    }

    subgraph cluster_GG {
        label="Journal litra GG 1829";

        GG27 [ label="27" ];
        GG112 [ label="112" ];
        GG177 [ label="177" ];
        GG921 [ label="921" ];
    }

    subgraph cluster_HH {
        label="Journal litra HH 1830";

        HH800 [ label="800" ];
    }

    subgraph cluster_KK {
        label="Journal litra KK 1832";

        KK262 [ label="262" ];
        KK541 [ label="541" ];
        KK644 [ label="644" ];
        KK701 [ label="701" ];
    }

    subgraph cluster_MM {
        label="Journal litra MM 1834";

        MM113 [ label="113" ];
        MM122 [ label="122" ];
        MM183 [ label="183" ];
    }

    subgraph cluster_NN {
        label="Journal litra NN 1835";

        NN644 [ label="644" ];
    }

    subgraph cluster_OO {
        label="Journal litra OO 1836";

        OO47 [ label="47" ];
        OO159 [ label="159" ];
        OO197 [ label="197" ];
        OO253 [ label="253" ];
        OO1032 [ label="1032" ];
    }

    subgraph cluster_PP {
        label="Journal litra PP 1837";

        PP485 [ label="485" ];
    }

    GG27  -> { GG112 }
    GG112 -> { GG27 GG177 KK541 }
    GG177 -> { GG112 HH800 }
    KK541 -> { GG112 KK644 }
    KK644 -> { KK541 KK701 }
    KK701 -> { KK644 MM113 }
    MM113 -> { KK701 MM122 MM183 }
    MM122 -> { MM113 }
    MM183 -> { MM113 OO47 }
    OO47 -> { MM183 OO159 }
    OO159 -> { OO47 OO197 }
    OO197 -> { OO159 OO253 }
    OO253 -> { OO197 OO1032 }
    OO1032 -> { OO253 PP485 }

    KK262 [ color=blue ]
    MM122 [ color=blue ]
    NN644 [ color=blue ]

    GG921 [ color=red ]
    HH800 [ color=red ]
    PP485 [ color=red ]

    00 -> GG27 [  weight=100 ];
    01 -> HH800 [  weight=100 ];
    02 -> KK262 [ style=invis weight=100 ];
    03 -> MM113 [ style=invis weight=100 ];
    04 -> NN644 [ style=invis weight=100 ];
    05 -> OO47 [ style=invis weight=100 ];
    06 -> PP485 [ style=invis weight=100 ];
}

введите здесь описание изображения


person meide    schedule 07.03.2015    source источник


Ответы (1)


В этом случае rankdir=LR работает лучше, поскольку горизонтальные столбцы более важны, а ранжирование — единственный механизм упорядочения. Упорядочение ортогонально рангу может быть достигнуто порядком появления и затруднено для сложных графов, особенно с кластерами.

digraph {
    rankdir=LR;
    nodesep=0.5;
    edge [ constraint=false ];

    subgraph cluster_GG {
        label="Journal litra GG 1829";

        GG921 [ label="921" ];
        {
            rank=same;
            GG27 [ label="27" ];
            GG112 [ label="112" ];
            GG177 [ label="177" ];
        }

        GG921 -> GG27 [ constraint=true style=invis ];

        GG27 -> GG112 -> GG177;
        GG177 -> GG112 -> GG27;
    }

    subgraph cluster_HH {
        label="Journal litra HH 1830";

        HH800 [ label="800" ];
    }

    subgraph cluster_KK {
        label="Journal litra KK 1832";

        {
            rank=same;
            KK541 [ label="541" ];
            KK644 [ label="644" ];
            KK701 [ label="701" ];
        }
        KK262 [ label="262" ];

        KK541 -> KK262 [ constraint=true style=invis ];

        KK541 -> KK644 -> KK701;
        KK701 -> KK644 -> KK541;
    }

    subgraph cluster_MM {
        label="Journal litra MM 1834";

        {
            rank=same;
            MM113 [ label="113" ];
            MM122 [ label="122" ];
        }
        {
            rank=same;
            MM0 [ style=none ];
            MM183 [ label="183" ];
        }

        MM113 -> MM0 [ constraint=true style=invis ];
        MM122 -> MM183 [ constraint=true style=invis ];

        MM113 -> MM122 -> MM113;
        MM113 -> MM183 -> MM113;

    }

    subgraph cluster_NN {
        label="Journal litra NN 1835";

        NN644 [ label="644" ];
    }

    subgraph cluster_OO {
        label="Journal litra OO 1836";

        {
            rank=same;
            OO47 [ label="47" ];
            OO159 [ label="159" ];
            OO197 [ label="197" ];
            OO253 [ label="253" ];
            OO1032 [ label="1032" ];
        }

        OO47 -> OO159 -> OO197 -> OO253 -> OO1032;
        OO1032 -> OO253 -> OO197 -> OO159 -> OO47;
    }

    subgraph cluster_PP {
        label="Journal litra PP 1837";

        PP485 [ label="485" ];
    }

    // cluster external horizontal order
    GG27 -> HH800 -> KK541 [ constraint=true style=invis ];
    KK262 -> MM113 [ constraint=true style=invis ];
    MM0 -> NN644 -> OO47 -> PP485 [ constraint=true style=invis ];

    // cluster external
    GG177:e -> HH800;

    GG112 -> KK541:w;
    KK541 -> GG112;

    KK701 -> MM113:w;
    MM113 -> KK701;

    MM183 -> OO47:w;
    OO47 -> MM183;

    OO1032 -> PP485;

    KK262 [ color=blue ];
    MM122 [ color=blue ];
    NN644 [ color=blue ];

    GG921 [ color=red ];
    HH800 [ color=red ];
    PP485 [ color=red ];

}

введите здесь описание изображения

person stefan    schedule 09.03.2015