Как выровнять подграфы в точечных файлах

Я пытаюсь выровнять три или более подграфа, используя точечные файлы и графическую визуализацию. Я думаю, что мою проблему лучше всего показать на нескольких примерах:

Моя первая попытка:

digraph FutopJobFlow {
    rankdir=LR;
    node [shape=box]
    compound=true

    subgraph clusterA {label = " A ";
        A -> a1;
        a1 -> a2;
        a2 -> a3;
    }

    subgraph clusterB {label = " B ";
        B -> b1;
        b1 -> b2;
    }

    subgraph clusterC {label = " C ";
        C -> c1;
        c1 -> c2;
    }
    A -> B [lhead=clusterB];
    B -> C [lhead=clusterC];
    X -> A [lhead=clusterA];
    Y -> B [lhead=clusterB];
    Z -> C [lhead=clusterC];
}

давая этот результат:

Первая попытка выравнивания подграфов

Здесь отдельные подграфы выглядят так, как хотелось бы, но они не выровнены. Поэтому я попробовал с командным званием:

digraph FutopJobFlow {
    rankdir=LR;
    node [shape=box]
    compound=true

    subgraph clusterA {label = " A ";
        A -> a1;
        a1 -> a2;
        a2 -> a3;
    }

    subgraph clusterB {label = " B ";
        B -> b1;
        b1 -> b2;
    }

    subgraph clusterC {label = " C ";
        C -> c1;
        c1 -> c2;
    }

    {rank=same; A; B; C;}

    A -> B [lhead=clusterB];
    B -> C [lhead=clusterC];
    X -> A [lhead=clusterA];
    Y -> B [lhead=clusterB];
    Z -> C [lhead=clusterC];
}

что приводит к следующему графику: Вторая попытка выравнивания подграфов

Здесь выравнивание выглядит хорошо, но теперь «A», «B» и «C» больше не находятся внутри подграфов!

Я пробовал несколько других способов добиться как выравнивания, так и того, что «A», «B» и «C» находятся внутри соответствующих подграфов, но безуспешно.

Кто-нибудь может помочь?

@ Marapet - Спасибо, теперь это почти идеально - это выглядит так, когда я добавляю параметр 'constraint = false':

График с параметром ограничения

Было бы идеально, если бы подграф «А» был выше «В», который опять-таки выше «С».


person Kasper Kjølby    schedule 08.10.2015    source источник


Ответы (1)


В первой версии вашего графа вы можете отключить влияние на ранжирование узлов для ребер между A-B и B-C, добавив атрибут constraint=false:

A -> B [lhead=clusterB, constraint=false];
B -> C [lhead=clusterC, constraint=false];

Затем подграфы должны быть выровнены.

person marapet    schedule 09.10.2015
comment
Спасибо, рынок - я добавил ваше решение в свой точечный файл и показал результат в своем исходном вопросе. Как видите, это почти идеально. Будет идеально, если подграф «A» будет выше «B», который снова был выше «C». - person Kasper Kjølby; 10.10.2015
comment
@KasperKjølby Просто измените порядок появления кластеров - сначала кластер C, кластер B, затем кластер A. Макеты Graphviz LR похожи на макеты сверху вниз, повернутые на 90 градусов против часовой стрелки, поэтому то, что находится слева на графиках сверху вниз, оказывается внизу графика. - person marapet; 10.10.2015