Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Graphviz: arranging clusters left-to-right with contents top-to-bottom

I have the below graph and I need the clusters/subgraphs to be arranged left-to-right G-H-K-M-N-O-P. The contents of each subgraph is fine as-is. How do I accomplish this? I have tried adding invisible edges as described in other questions, but it's not working as expected.

The G/H boxes need to be in the correct order, but playing with the weights isn't working out...

The code below renders the image at the bottom. The 00/01 nodes are set to be visible to show where the order is mixed up.

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 ];
}

enter image description here

like image 255
meide Avatar asked Mar 07 '15 09:03

meide


1 Answers

In this case rankdir=LR is working better as the horizontal columns are more important and ranking is the only ordering mechanism. Oordering orthogonally to rank may be achieved by the order of appearence and is difficult for complex graphs especially with clusters.

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 ];

}

enter image description here

like image 185
stefan Avatar answered Nov 19 '22 06:11

stefan