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

时间:2019-10-23 02:39:41

标签: graphviz diagrammer

我有一个可以用英语概括的图形:

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的边缘以更美观的方式弯曲。我希望它从E的's'端口出来,向左转90度,继续向左直到到达节点B,然后向上向90度转一圈,然后输入B的's'端口以垂直方式。我相信发生这种情况是由于graphViz间隔了样条曲线点的方式-我想我实际上想做的是将每个中间样条曲线点向下拖动一点,以使边缘的左行部分平坦。

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

此外,我在R中使用 diagrammeR 将其呈现为PDF和HTML文档,因此,如果有必要,此处的任何答案都应与输出格式无关。

有什么建议吗?我曾尝试搜索graphViz文档无济于事,但找不到任何能解决这些问题的可行示例。

1 个答案:

答案 0 :(得分:1)

要改善节点的位置和边缘的形状(尽管这并非您想象的那样),请使用constraint=false

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

AB之间的空格比较复杂-图形和子图形中的等级分隔相同。您可以插入不可见的节点以增加距离,但这可能不值得:

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

并使用B反转从Adir=back的边的方向:

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

not perfect