GraphViz принудительно использует столбцы

У меня есть следующая точка:

digraph G
{
    rank="same";
    subgraph sys
    {
        1 [shape=record, label="| | Système"];
    }

    subgraph obj
    {
        2 [shape=box, label="Sites"];
        3 [shape=box, label="Sociétés de\nmaintenance"];
        1 -> 2 [arrowhead=none] [label="a"];
        1 -> 3 [arrowhead=none] [label="b"];
    }

    subgraph constraints
    {
        4 [style=dotted, label="Surveiller"];
        5 [style=dotted, label="Effectuer des\ninterventions"];
        4 -> 2 [style=dotted];
        4 -> 3 [style=dotted];
        5 -> 2 [style=dotted];
        5 -> 3 [style=dotted];
    }

}

Что дает мне это изображение:

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

Но я хочу иметь подграф по столбцу (1 в первом столбце, 2-3 во втором и 4-5 в последнем).

Есть ли способ сделать это?

За вашу помощь, Спасибо заранее.


person GlinesMome    schedule 17.01.2013    source источник


Ответы (2)


digraph G
{
    rank=same
    rankdir=LR

    subgraph sys
    {
        1 [shape=record, label="| | Système"]
    }
    subgraph obj
    {
        node [shape=box]
        2 [label="Sites"]
        3 [label="Sociétés de\nmaintenance"]
    }
    subgraph constraints
    {
        node [style=dotted]
        4 [label="Surveiller"]
        5 [label="Effectuer des\ninterventions"]
    }

    edge [style=invis, weight=2]
    2->4
    3->5

    edge [style=dotted]
    4 -> 2
    4 -> 3
    5 -> 2
    5 -> 3

    edge [style="" arrowhead=none]
    1 -> 2 [label="a"]
    1 -> 3 [label="b"]
} 

Это решение такое же, как предложено @alexandr_anturis (+1), но я удалил некоторый неуместный «синтаксический шум», потому что я чувствую, что такая сложная и мощная спецификация, как язык dot, выигрывает от любого доступного упрощения.

Используйте rankdir и скрытые ребра с соответствующими weight.

Изображение результата:

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

person CapelliC    schedule 17.01.2013

digraph G
{
rank="same";
layout="dot";
rankdir=LR;
subgraph sys
{
    style=filled;
    1 [rank=1, shape=record, label="| | Système"];
}



subgraph obj
{
    2 [rank=2,shape=box, label="Sites"];
    3 [rank=3,shape=box, label="Sociétés de\nmaintenance"];
}
subgraph constraints
{
    4 [rank=4,style=dotted, label="Surveiller"];
    5 [rank=5,style=dotted, label="Effectuer des\ninterventions"];
}
    2->3->4->5 [color=white, weight=100];
    rankdir=LR;
    4 ->2 [style=dotted, w=0];
    4 -> 3 [style=dotted, w=0];
    5 -> 2 [style=dotted, w=0];
    5 -> 3 [style=dotted, w=0];


    1 -> 2 [arrowhead=none] [label="a"];
    1 -> 3 [arrowhead=none] [label="b"];
} 

Вы можете использовать что-то вроде этого. Способ сделать то, что вы хотите, — это использовать rankdir и добавить невидимые ребра для правильного ранжирования.

person Meriadoc Brandybuck    schedule 17.01.2013