Почему верхний и нижний графы графов расположены против часовой стрелки? - PullRequest
3 голосов
/ 03 февраля 2011

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

почему этот код создает этот график?

digraph {
 rankdir = TB;
 1 -> 2 -> 3 -> 1;
}

Хостинг imgur.com

Как мне получить график / точку, чтобы получить направление по часовой стрелке, как это?

Хостинг imgur.com

Обновление

Это последний график, который я хочу сгенерировать (это логически правильно),

digraph {
  rankdir = TB
  start -> 1
  1 -> 2 -> 3 -> 1
  3 -> end
  3 -> increment
  end -> product
  {rank = same; 2; 3; increment}
  {rank = same; end; product}
}

, который дает этот результат

Хостинг imgur.com

Пока я хочу это

Хостинг imgur.com

Спасибо

1 Ответ

8 голосов
/ 03 февраля 2011

Почему этот код создает этот график?

Ориентированный граф помещает свои узлы в разные ранги в зависимости от их отношений. Так как 1 указывает на 2, он должен быть выше 2, а с 2 баллов до 3 он становится выше 3. Но так как 3 также указывает на 1, круг завершен - любой из 3 узлов может быть сверху. Graphviz просто помещает первый упомянутый узел сверху. Поэтому, если вы напишите вместо:

2 -> 3 -> 1 -> 2;

узел 2 будет сверху, а при использовании

3 -> 1 -> 2 -> 3;

узел 3 будет верхним узлом.

Возможно, для этого графика больше подойдет механизм компоновки neato, создающий график с направлением по часовой стрелке:

neato layout

Если вам абсолютно необходимо использовать механизм точечной разметки, следующий код точки

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;}

Этот хак дает следующий результат:

hack

...