graphViz / dot: настройка расположения узлов и формы ребер - PullRequest
0 голосов
/ 23 октября 2019

У меня есть график, который можно обобщить на английском языке следующим образом:

A -> [B -> C -> D] -> E
B -> A
E -> B

Где квадратные скобки указывают на подграф с рамкой вокруг него.

Я реализовал его вgraphViz / dot выглядит следующим образом:

digraph {
  rankdir = LR
  graph [overlap = true, fontname = Helvetica]

  A [shape="box", style="dashed", label="Alab"]

  subgraph clusterx {
    node [shape="box"]
    B [label="Blab"]
    C [label="Clab"]
    D [label="Dlab"]

    B -> C -> D
    label = "Subgraph Box Label";
    labeljust = "l";
  }

  E [shape="box", style="dashed", label="Elab"]
  A -> B [label = " ", headport="nw", tailport="ne"]
  B -> A [label = " ", headport="se", tailport="sw"]
  D -> E
  E -> B [tailport="s", headport="s"]
}

Current Graph

Это корректно отображается, но я хотел бы исправить несколько визуальных вещей.

  1. Я хочу, чтобы между A и подграфом было больше места и меньше места между узлами подграфа.
  2. Я хочу, чтобы E находился в том же вертикальном положении, что идругие узлы. Я хочу, чтобы кромка D -> E была плоской линией.
  3. Я хочу, чтобы кромка E -> B изгибалась более эстетично. Я бы предпочел, чтобы он вышел из порта 's' E, повернул влево на 90 градусов, продолжил движение влево, пока не достигнет узла B, а затем повернул на 90 градусов вверх и ввел 's'порт B перпендикулярно. Я полагаю, что это происходит из-за способа, которым graphViz расставляет точки сплайна - я думаю, что я действительно хочу сделать, это немного перетащить каждую промежуточную точку сплайна так, чтобы левая часть края была плоской.

Я пытался настроить параметры nodesep и ranksep, чтобы решить первые две проблемы, и не смог последовательно понять, почему вносимые мной изменения приводят к изменениям, которые они делают. Я вообще не смог решить # 3.

Кроме того, я использую diagrammeR в R для рендеринга этого в документы PDF и HTML, поэтому любой ответ здесь должен быть независимым от формата вывода. В случае, если это имеет значение.

Любой совет? Я попытался просмотреть документацию GraphViz безрезультатно, и я не могу найти работающие примеры, которые показывают эти проблемы.

1 Ответ

1 голос
/ 23 октября 2019

Чтобы улучшить положение узлов и форму края (хотя это не совсем то, что вы себе представляли), используйте constraint=false:

E -> B [tailport="s", headport="s", constraint=false]

Расстояние между A и B хитрее - ранг Разделение одинаково на графике и на подграфе. Вы можете вставить невидимый узел, чтобы увеличить расстояние, хотя это может не стоить того:

ranksep=0.2;
invisnode[style=invis, shape=point, width=0.2];
A -> invisnode [style=invis];
invisnode -> B [style=invis];

и инвертировать направление ребра от B до A с помощью dir=back:

A -> B [label = " ", headport="sw", tailport="se", dir=back]

not perfect

...