Лучшее расположение узлов для блок-схем в точках

После предыдущего вопроса (макет блок-схемы с точкой/Graphviz) у меня есть еще вопросы. Следующее компилируется так:

точка -Gsplines=нет test.gv | аккуратно -n -Gsplines=орто -Tpng -otest.png

digraph G {
    graph [rankdir = LR];

    node[shape=record, style=filled];

bar[label="Bar", height=1.3636363636363635];
tea[label="Tea", height=1.3636363636363635];
brew[label="Brew", height=3.6363636363636362];
bar1[label="Bar1", height=2.2727272727272725];
baz[label="Baz", height=1];
foo[label="Foo", height=5.0];
darjeeling[label="Darjeeling", height=3.1818181818181817];
example[label="Example", height=17.727272727272727];

bar -> example [label="bar_clk"];
bar -> example [label="bar_bar"];
example -> tea [label="bli1"];
example -> tea [label="blo2"];
example -> tea [label="blo3"];
example -> brew [label="bli"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
bar1 -> example [label="bar1_foo"];
bar1 -> example [label="bar1_bar"];
bar1 -> example [label="bar1_baz"];
bar1 -> example [label="bar1_baz1"];
bar1 -> example [label="bar1_bar2"];
baz -> example [label="baz_foo"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> bar [label="blu"];
example -> baz [label="ble"];
darjeeling -> example [label="darjeeling_bli1"];
darjeeling -> example [label="darjeeling_blo2"];
darjeeling -> example [label="darjeeling_blo3"];
darjeeling -> example [label="darjeeling_bli1"];
darjeeling -> example [label="darjeeling_blo2"];
example -> darjeeling [label="bla"];
darjeeling -> example [label="darjeeling_blo3"];
}

Мой вопрос заключается в том, как я могу взять, скажем, узлы Baz и Darjeeling и переместить их влево, чтобы уменьшить высоту среднего узла. Я не знаю, что это определяет. Я понимаю, что это направленный граф, поэтому общий «поток» диаграммы слева направо, я просто хотел бы больше контроля.

Эти диаграммы будут сгенерированы автоматически, поэтому предпочтительнее объяснение того, как их расположить так, как я хочу, и почему, а не фрагмент кода, который заставляет их работать для этого конкретного примера.

Спасибо!


person Christoph    schedule 07.11.2011    source источник


Ответы (1)


Несколько моментов:

как я мог бы взять, скажем, узлы База и Дарджилинга и переместить их на левую сторону

Установив constraint=false для ребер, идущих от Example к Baz и Darjeeling, или сгруппировав все узлы, чтобы они отображались слева от Example< /em> в подграфе с rank=min.

Вы можете сказать, что это неподходящее решение (по крайней мере, не то, что с constraint=false), потому что

Эти диаграммы будут созданы автоматически

и я прекрасно понимаю (был там много раз) - но в то же время вы желаете

уменьшить высоту среднего узла

который устанавливается вручную, поэтому график по-прежнему не полностью сгенерирован автоматически (как рассчитать высоту, необходимую для примера?).

Я не знаю, что определяет это

Я тоже не совсем уверен - Баз вполне может быть и слева.

Удивительно, но порядок появления узлов в некоторых случаях меняет макет. Например, если вы переместите определение узла Дарджилинг вверх, он появится слева (а Bar окажется справа).


Изменить: Вот фрагмент кода...

Третий вариант — определить все ребра в порядке справа (сверху-вниз/слева-направо) и украсить ребра, идущие назад, с помощью dir=back.

Если вы измените эти 3 строки

example -> bar [label="blu"];
example -> baz [label="ble"];
example -> darjeeling [label="bla"];

в

bar -> example [label="blu", dir=back];
baz -> example [label="ble", dir=back];
darjeeling -> example [label="bla", dir=back];

или в

example -> bar [label="blu", constraint=false];
example -> baz [label="ble", constraint=false];
example -> darjeeling [label="bla", constraint=false];

(и изменить высоту example)

Ты получишь

результат графвиза

person marapet    schedule 07.11.2011
comment
Спасибо за ответ. Подграф может работать. Я также могу поместить туда некоторые ограничения = ложные вещи, просто нужно немного поиграть с этим. Теперь высота вычисляется на основе количества ребер; хотя это легко изменить. Я знал об изменении порядка, но не сделал стороны более сбалансированными. Поиграю с подграфами и сообщу, спасибо! - person Christoph; 08.11.2011
comment
Извините за столь поздний ответ. Это выглядит очень многообещающе, так что это принятый ответ! - person Christoph; 16.11.2011