Установить направление узла на графике - PullRequest
5 голосов
/ 10 января 2012

Предположим, этот код использует neato:

graph sample {
  layout=neato
  overlap=false
  splines=true
  tailclip=false
  headclip=false
  A -- I
  A -- J
  A -- B
  A -- H
  A -- E
  A -- K
  B -- D
  B -- C
  B -- L
  C -- M
  C -- N
  C -- O
  D -- P
  D -- Q
  E -- R
  F -- A
  G -- F
  H -- J
}

Это дает нам следующую диаграмму:

neato diagram

Мне нужно разместить узел X, всегда зафиксированный в позиции к югу от его родительского узла. Т.е. если я поставлю другое отношение A -- X, X всегда должно быть расположено к югу от A. И мне все равно, где все остальное заканчивается.

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

Также tailport и headport, но они определяют только то, откуда ребро выйдет / войдет, но на самом деле не влияют на направление узла.

Update

Дополнительное изображение, чтобы прояснить ситуацию:

x should be south from his parent

Мне не требуется neato, но я не хочу, чтобы график выглядел как дерево точек UD или LR, я не хочу, чтобы он был линейно упорядочен. Цирко, FDP, SFDP, Twopi тоже в порядке.

Ответы [ 2 ]

4 голосов
/ 17 января 2012

Программа neato поддерживает несколько режимов, один из которых, вероятно, может дать вам то, что вы хотите.В частности, если вы установите mode = ipsep, вы можете указать точечные ограничения, которые будут соблюдаться во время макета.Например, я беру ваш график и использую атрибуты графика

mode=ipsep
diredgeconstraints=true
levelsgap=0.5

Первый включает режим ipsep, второй говорит модели поддерживать направленные ребра, как в точке, а последний указывает, насколько сильным должно быть разделение.быть.Затем я устанавливаю для атрибута edge dir значение none

edge[dir=none]

и добавляю ребро A - X [dir = 1]

Значение dir = 1 указывает, что этот ребро должно вызывать ограничение направления.Если я затем запускаю neato, я получаю добавленную картинку.

neato layout

В документации по атрибутам Graphviz http://www.graphviz.org/content/attrs содержится дополнительная информация об этих атрибутах.

4 голосов
/ 13 января 2012

В ответ на обновленные ограничения одним из решений является закрепление A и X, а затем разметка графика вокруг них:

graph sample {
overlap=false;
splines=true;
tailclip=false;
headclip=false;

A [pin=true,pos="0,.2"]
X [pin=true,pos="0,.1"]
A -- I
A -- J
A -- B
A -- H
A -- E
A -- K
B -- D
B -- C
B -- L
C -- M
C -- N
C -- O
D -- P
D -- Q
E -- R
F -- A
G -- F
H -- J
A -- X

graph output

Я пробовал макет си neato, и fdp, и кажется, что получается график, который вы хотите.Естественно, если вы хотите наложить такое ограничение на произвольные пары узлов в одном графе, это решение может не сработать.

--- Более ранний ответ ---

Если выЯ не уверен, что есть способ решить проблему без изменения графика на этапе постобработки.Если neato - это просто удобное значение по умолчанию, тогда вы сможете решить свою проблему, используя вместо этого точку в качестве движка компоновки, и используя "rankdir = UD", плюс пару дополнительных ключей, если X нужно направить на юг.

В случае, если вам нужно только ограничение для применения к одному узлу X, тогда объединение X и A в кластере должно выполнить работу:

graph sample {
  rankdir=UD 
  layout=dot
  overlap=false
  // .. as before
  A -- X
  subgraph clusterone {
   style=invisible
   A
   X
  }
}

Если вам нужно строгоЮжное ограничение применяется к произвольным дочерним элементам A, затем этот тип кластеризации с последующим приемом, описанным в:

Как заставить все узлы в одном столбце в Graphviz?

может добиться цели.Атрибут clusterrank=local также может быть полезен в этом случае, но я не уверен.Надеюсь, это поможет.

...