Организация кластеров графвиз - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь сгенерировать следующую конструкцию: у меня есть четыре графика.Три из них должны быть в первом «ряду», все вертикально выровнены по их вертикальному центру.Предполагается, что четвертый график находится ниже остальных трех во втором «ряду».Он должен быть выровнен по горизонтали либо с горизонтальным центром среднего графика верхнего ряда, либо с горизонтальным центром всего верхнего ряда.Кроме того, будут некоторые ребра между некоторыми членами отдельных кластеров / графов.Here is an example. Здесь есть только ребра между членами cluster_a и cluster_d, но могут быть ребра между членами любой комбинации кластеров.

1 Ответ

0 голосов
/ 02 января 2019

Обычно вы можете сделать это, добавив несколько дополнительных невидимых складывающихся узлов и ребер, например:

digraph G {
    rankdir=LR
    edge[minlen=2]//enable finer control over node location when scarfolding
    subgraph cluster_d { label=cluster_d
        d_0->d_2
        d_1->d_0
        //d_1->d_3
        //extra node to simulate edge between edges
        d_13[shape=point]
        d_1->d_13[dir=none minlen=1]
        d_13->d_3[minlen=1]
        d_3->d_2
        d_3->d_3
    }
    subgraph cluster_abc { // better align cluster
    subgraph cluster_a { label=cluster_a
        a_0->a_2
        a_0->a_3
        a_1->a_0
        a_1->a_1 
        a_1->a_2
        a_1->a_3
        //a_2->a_3
        //extra node to simulate edge between edges
        a_23[shape=point]
        a_2->a_23[dir=none minlen=1]
        a_23->a_3[minlen=1]
        a_3->a_2
        a_3->a_3
    }
    subgraph cluster_c { label=cluster_c
        c_0->c_0
        c_0->c_1
        c_0->c_2
        c_0->c_3
        c_1->c_3
        c_3->c_3
        c_2->c_0
        c_2->c_1
        c_2->c_2
        c_2->c_3
    }
    subgraph cluster_b { label=cluster_b
        b_0->b_0
        b_0->b_2
        b_0->b_3
        b_1->b_1
        b_1->b_2
        b_1->b_3
        b_2->b_0
        b_3->b_2
    }
    color=invis
    }
    {//scarfolding
        edge[style=invis]node[style=invis] //hide scarfolding
        {
            rank=same 
            node[shape=point] //minimize impact on edge routing around the scarfolding nodes
            x_0 
            x_1
        }
        a_3->c_0
        c_3->b_0
        // we can not use same rank across cluster boundary so instead of a_3->d_1 we do a_2->x_0 + x_1->d_1
        a_2->x_0 
        x_1->d_1[minlen=3]
    }
    {
        edge[headclip=false tailclip=false]
        a_2->d_1[dir=none constraint=false]
        a_3->d_3[dir=none]
    }
    a_23->d_13[dir=none constraint=false]
}

rendered on viz-js.com

...