3

У меня очень простой график:

digraph G {
  "for" -> "initial assignment"
  "initial assignment" -> "condition"
  "condition" -> "code" [color=red]
  "condition" -> "end" [color=red]
  "code" -> "final assignment" [color=red]
  "final assignment" -> "condition" [color=red]
}

Смотрите вывод

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

Один из способов сделать это:

digraph G {

  {rank = same; "$1"; "for"}
  {rank = same; "$2"; "initial assignment"}
  {rank = same; "$3"; "condition"}
  {rank = same; "$4"; "final assignment"}
  {rank = same; "$5"; "code"}
  {rank = same; "$6"; "end"}

  "$1" -> "$2" -> "$3" -> "$4" -> "$5" -> "$6"    

  "for" -> "initial assignment"
  "initial assignment" -> "condition"
  "condition" -> "code" [color=red]
  "condition" -> "end" [color=red]
  "code" -> "final assignment" [color=red]
  "final assignment" -> "condition" [color=red]

}

Смотрите вывод

Тем не менее, это отображает эти дополнительные узлы на графике, и я бы предпочел не иметь этого. Как я могу определить узлы и ребра, не рисуя их?

(Я мог бы определить края, чтобы быть белым, текст узла, чтобы быть белым, и т.д., Но graphviz все равно выделил бы пространство для них, и это не будет работать на прозрачных изображениях PNG. Кроме того, слои не работают для всех выходных форматов, таких как .png, и пространство, необходимое для этих узлов, по-прежнему выделено. Давайте не будем рассматривать эти решения.)

2 ответа2

3

Почему бы не использовать сами узлы для предложения конкретного заказа?

digraph G
{
  {
    edge[style=invis]

    a[label="for"]
    b[label="initial assignment"]
    c[label="condition"]
    d[label="final assignment"]
    e[label="code"]
    f[label="end"]

    a -> b -> c -> d -> e -> f
  }

  a -> b -> c
  c -> e [color=red]
  c -> f [color=red]
  e -> d -> c [color=red]
}
1

Стивен Норт, автор Graphviz, предлагает использовать [style=invis]:

digraph G {

  {
    node [style=invis]
    edge [style=invis]
    "$1" -> "$2" -> "$3" -> "$4" -> "$5" -> "$6"    
  }

  {rank = same; "$1"; "for"}
  {rank = same; "$2"; "initial assignment"}
................................................................................

выход

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .