Приведение узлов "основной линии" в прямую линию в Graphviz (или альтернативы) - PullRequest
23 голосов
/ 12 января 2011

Я пытаюсь использовать Graphviz dot (но готов использовать что-то еще) для генерации графа с длинной "основной линией" узлов и множеством небольших ветвей. Я бы хотел, чтобы основная линия была прямой слева направо, с небольшими ветвями над или под ней. Тем не менее, Graphviz «балансирует» две ветви, поэтому я получаю кривую кривую.

Чтобы проиллюстрировать, вот набросок, похожий на тот, который я сейчас получаю:

Current Graph

И вот что я на самом деле хочу:

Wanted graph

Есть ли способ заставить или стимулировать Graphviz сгенерировать график, подобный второму? Возможно, я смогу использовать «фиктивные» вторые ветви, чтобы он сделал 3-стороннюю разметку, а затем скрыть / удалить макеты позже, но если есть лучший вариант, который будет предпочтительнее.

Ответы [ 2 ]

36 голосов
/ 12 января 2011

Вот решение с использованием атрибута ребер weight :

digraph G {
    rankdir="LR";
    node[width=0.15, height=0.15, shape=point];
    edge[weight=2, arrowhead=none];
    1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8;
    edge[weight=1];
    2 -> 9 -> 10 ;
    5-> 11 -> 12;
}

Результат:

graphivz

32 голосов
/ 12 января 2011

Второе решение с использованием атрибута group узлов - опять же ориентированный граф:

Из ссылки на точку graphviz:

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

digraph g{
    rankdir="LR";
    node[width=0.15, height=0.15, shape=point, group=main];
    edge[arrowhead=none];
    1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8;
    node[group=branches];
    2 ->  9 -> 10;
    5 -> 11 -> 12;
}

Вывод точно такой же, как в моем первом ответе.

...