Графвиз, порядок узлов в орграке слева направо (цепь Маркова)

Я хотел бы использовать graphviz для построения графа простой цепи Маркова. Ниже приведен код, который я использовал, и график, который я получил.

Как сделать так, чтобы все узлы располагались на горизонтальной оси в том же порядке, что и в .dot файл? Видимо, порядок узлов в исходном файле не решает проблему.

(Приятно иметь) Как я могу сделать ребра между 2 и 3, 3 и 4 и 4 и 5 симметричными относительно горизонтальной оси, на которой сидят узлы? Вы можете видеть, что р ребра прямые, но д изогнуты. Я бы хотел, чтобы они оба изогнулись.

digraph {
    rankdir=LR;
    node [shape = circle];

    1
    2
    3
    4
    5
    6

    1 -> 1[label="1"];

    2 -> 1[label="q"];
    2 -> 3[label="p"];

    3 -> 2[label="q"];
    3 -> 4[label="p"];

    4 -> 3[label="q"];
    4 -> 5[label="p"];

    5 -> 4[label="q"];
    5 -> 6[label="p"];

    6 -> 6[label="1"];
}

1 ответ

Решение

Самый важный шаг - убедиться, что все узлы имеют одинаковый ранг:

digraph 
{
    rankdir=TB;
    node [ shape = circle ];
    { rank = same; 1 2 3 4 5 6 }

    2 -> 3[label="p"];
    3 -> 4[label="p"];
    4 -> 5[label="p"];
    5 -> 6[label="p"];
    6:ne -> 6:nw[label="1"];

    edge[ dir = back ];
    1:ne -> 1:nw[label="1"];
    1 -> 2[ label="q"];
    2 -> 3[label="q"];
    3 -> 4[label="q"];
    4 -> 5[label="q"];
}

доходность

Другие вопросы по тегам