graphViz/dot: 调整节点位置和边缘形状

graphViz/dot: Adjusting node placement and edge shape

我有一张图表,可以用英语概括为:

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"]
}

这是一种有效的渲染方式,但我想更正一些视觉上的问题。

  1. 我希望 A 和子图之间有更多的 space,子图的节点之间有更少的 space。
  2. 我希望 E 与其他节点处于同一垂直对齐方式。我希望 D -> E 边缘是一条平线。
  3. 我希望 E -> B 边缘以更美观的方式弯曲。我希望它从 E 的 's' 端口出来,向左转 90 度,继续向左直到到达节点 B,然后向上转 90 度,并垂直进入B的's'端口。我相信这是因为 graphViz spaces 样条点的方式——我想我真正想做的是将每个中间样条点向下拖动一点,以便边缘的左行部分是平.

我曾尝试调整 nodesepranksep 参数来解决前两个问题,但无法始终如一地理解为什么我所做的更改会产生它们所做的更改。我根本无法解决#3。

此外,我在 R 中使用 diagrammeR 将其呈现为 PDF 和 HTML 文档,所以这里的任何答案都应该与输出格式无关,以防万一.

有什么建议吗?我已尝试搜索 graphViz 文档,但无济于事,而且我找不到任何展示这些问题的有效示例。

为了改善节点的位置和边缘的形状(虽然这不是你想象的那样),使用constraint=false:

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

AB 之间的 space 更棘手 - 等级分离在图和子图中是相同的。您可以插入一个不可见的节点来增加距离,尽管这可能不值得:

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

并使用 dir=back:

反转从 BA 的边的方向
A -> B [label = " ", headport="sw", tailport="se", dir=back]