Почему этот код создает этот график?
Ориентированный граф помещает свои узлы в разные ранги в зависимости от их отношений. Так как 1 указывает на 2, он должен быть выше 2, а с 2 баллов до 3 он становится выше 3.
Но так как 3 также указывает на 1, круг завершен - любой из 3 узлов может быть сверху. Graphviz просто помещает первый упомянутый узел сверху. Поэтому, если вы напишите вместо:
2 -> 3 -> 1 -> 2;
узел 2 будет сверху, а при использовании
3 -> 1 -> 2 -> 3;
узел 3 будет верхним узлом.
Возможно, для этого графика больше подойдет механизм компоновки neato
, создающий график с направлением по часовой стрелке:
Если вам абсолютно необходимо использовать механизм точечной разметки, следующий код точки
digraph {
rankdir = TB;
1 -> 2;
3 -> 2 [dir=back];
3 -> 1;
{rank=same; 2; 3;}
}
дает желаемый выходной сигнал, изменяя ребро 2-> 3 на 3-> 2 и одновременно инвертируя направление стрелки.
Или другой вариант того же метода, который легче объяснить: мы изменяем порядок всех стрелок (1-> 3-> 2-> 1), но отображаем их назад (dir = назад) и заставить узлы 2 и 3 быть на одном уровне:
rankdir = TB;
edge[dir=back];
1 -> 3 -> 2 -> 1;
{rank=same; 2;3;}
Этот хак дает следующий результат: