Порядок, в котором вы упоминаете узлы в макете, важен.
Если у вас горизонтальный макет (rankdir=LR
), узлы появляются в вашем макете снизу вверх, посмотрите на это, например:
digraph {
rankdir=LR
node1
node2
node3
}
В результате:
Теперь, если мы изменим порядок:
digraph {
rankdir=LR
node3
node2
node1
}
Мы получаем это:
PS: я не рекомендую использовать орто-сплайны, они могут вызывать всевозможные артефакты, включая очень плохую обработку краевых меток. Вы проблемы с выстраиванием в линию могут быть вызваны ими. Даже когда я компилирую ваш код на моей машине, узлы выстроены правильно.
Чтобы ответить на ваш вопрос в комментариях:
Как реализовать параллельные ребра без splines=ortho
Но позвольте мне предупредить вас, это очень некрасиво.
В Graphviz вы можете использовать HTML-подобный синтаксис для определения некоторых структур, наиболее важными из которых являются таблицы. Любой достаточно старый пользователь скажет вам, что вы можете создавать почти что угодно , используя таблицы. Я часто их использую при работе с графвизом.
Что вы можете сделать в вашей ситуации: вместо ваших простых прямоугольных узлов разместите таблицу с тремя рядами. Верхний ряд и нижний ряд будут пустыми. Средний будет содержать ваш ярлык: FLIPA или FLOPA.
Далее вы назначаете атрибут port
для всех ячеек. Таким образом, вы сможете соединить определенные строки таблиц вместе, используя headport и tailport (или их синонимы, синтаксис двоеточия, который я использовал в пример ниже).
Вот пример:
digraph G {
graph [pad ="1", rankdir = LR];
size = "16.66,8.33!"; // 1200x600 at 72px/in, "!" to force
ratio = "fill";
node[shape=record];
flipb[
shape=plain
label=<
<table border="1" cellspacing="0" cellborder="0">
<tr>
<td height="80" port="upper"> </td>
</tr>
<tr>
<td height="80" port="middle">FLIPB</td>
</tr>
<tr>
<td height="80" port="bottom"> </td>
</tr>
</table>
>
];
flopb[
shape=plain
label=<
<table border="1" cellspacing="0" cellborder="0">
<tr>
<td height="80" port="upper"> </td>
</tr>
<tr>
<td height="80" port="middle">FLOPB</td>
</tr>
<tr>
<td height="80" port="bottom"> </td>
</tr>
</table>
>
];
flipa[
shape=plain
label=<
<table border="1" cellspacing="0" cellborder="0">
<tr>
<td height="80" port="upper"> </td>
</tr>
<tr>
<td height="80" port="middle">FLIPA</td>
</tr>
<tr>
<td height="80" port="bottom"> </td>
</tr>
</table>
>
];
flopa[
shape=plain
label=<
<table border="1" cellspacing="0" cellborder="0">
<tr>
<td height="80" port="upper"> </td>
</tr>
<tr>
<td height="80" port="middle">FLOPA</td>
</tr>
<tr>
<td height="80" port="bottom"> </td>
</tr>
</table>
>
];
source1[shape=rarrow];
source2[shape=rarrow];
sink1[shape=rarrow];
sink2[shape=rarrow];
source1 -> flipa;
flipa:upper -> flopa:upper [label="red" color=red,penwidth=3.0];
flipa:bottom -> flopa:bottom [label="blue" color=blue,penwidth=3.0];
flopa -> sink1;
source2 -> flipb;
flipb:upper -> flopb:upper [label="red" color=red,penwidth=3.0];
flipb:bottom -> flopb:bottom [label="blue" color=blue,penwidth=3.0];
flopb -> sink2;
label="Graph";
labelloc=top;
labeljust=left;
}
Результат: