Graphviz: запретить горизонтальные края, всегда показывать вертикальную ориентацию

У меня есть направленный ациклический граф, который я пытаюсь визуализировать с помощью Graphviz dot. По умолчанию он расположен сверху вниз.

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

Есть ли способ запретить это и заставить его всегда позиционировать узлы так, чтобы стрелки указывали «вниз»?

Источник образца:

digraph {
  rankdir=TB;
  subgraph cluster_1 { "8"; "7"; "9"; "11"; "10" }
  subgraph cluster_2 { "3"; "4"; "5"; }

  "1" -> "3";
  "2" -> "5";
  "3" -> "6";
  "3" -> "5";
  "2" -> "8";
  "2" -> "4";
  "2" -> "3";
  "2" -> "6";
  "2" -> "7";
  "1" -> "8";
  "7" -> "8";
  "4" -> "6";
  "6" -> "10";
  "3" -> "11";
  "7" -> "10";
  "7" -> "6";
  "1" -> "2";
  "6" -> "5";
  "7" -> "9";
  "7" -> "5";
  "4" -> "5";
  "6" -> "8";
  "3" -> "4";
  "10" -> "11";
  "4" -> "11";
  "3" -> "8";
  "8" -> "9";
  "6" -> "9";
  "9" -> "10";
  "3" -> "10";
  "3" -> "7";
}

person Szabolcs    schedule 19.05.2015    source источник


Ответы (2)


Я знаю, что это старый вопрос, но я предоставлю этот ответ для дальнейшего использования:

Вы можете использовать newrank = true;, который делает следующее согласно веб-сайту graphviz.org< /а>:

Исходный алгоритм ранжирования в dot является рекурсивным по кластерам. Это может привести к меньшему количеству рангов и более компактной компоновке, но иногда за счет того, что головной узел размещается на более высоком ранге, чем хвостовой узел. Также предполагается, что узел не ограничен отдельными несовместимыми подграфами. Например, узел не может находиться в кластере, а также быть ограничен рангом=то же, что и узел, не входящий в кластер.

Если newrank=true, алгоритм ранжирования выполняет одно глобальное ранжирование, игнорируя кластеры. Это позволяет узлам подвергаться нескольким ограничениям. Ограничения ранга обычно имеют приоритет над ограничениями края.

Таким образом, ваш источник изменяется только следующим образом:

  digraph {
      rankdir=TB;
      newrank = true;
      ...

И результат будет намного лучше для этого примера:

введите здесь описание изображения

person Wodanaz Spitfire    schedule 15.05.2019
comment
Не думайте, что ответы на старые вопросы не будут оценены! Идеальный вопрос/ответ StackOverflow будет полезен многим будущим читателям даже спустя годы. - person Szabolcs; 15.05.2019
comment
Спасибо за добавление изображения. Интересно, что алгоритм ранжирования по умолчанию упорядочивает кластеры справа налево, в то время как более новый алгоритм упорядочивает их слева направо. - person Wodanaz Spitfire; 15.05.2019

Такое поведение вызвано кластерами, которые фиксируют ранг узла внутри. «Сила» с внешних ребер тянет узлы по горизонтали, но не влияет на ранг.

Вы должны либо избегать кластеров, либо вставлять невидимые узлы и ребра.

Минимальный пример, показывающий исправление ранга

digraph {
    subgraph cluster_1 {
        1
        3
    }
    1 -> 2
    2 -> 3
}

введите здесь описание изображения

person stefan    schedule 20.05.2015