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"]
}
这是一种有效的渲染方式,但我想更正一些视觉上的问题。
- 我希望
A
和子图之间有更多的 space,子图的节点之间有更少的 space。
- 我希望
E
与其他节点处于同一垂直对齐方式。我希望 D -> E
边缘是一条平线。
- 我希望
E -> B
边缘以更美观的方式弯曲。我希望它从 E
的 's' 端口出来,向左转 90 度,继续向左直到到达节点 B
,然后向上转 90 度,并垂直进入B
的's'端口。我相信这是因为 graphViz spaces 样条点的方式——我想我真正想做的是将每个中间样条点向下拖动一点,以便边缘的左行部分是平.
我曾尝试调整 nodesep
和 ranksep
参数来解决前两个问题,但无法始终如一地理解为什么我所做的更改会产生它们所做的更改。我根本无法解决#3。
此外,我在 R 中使用 diagrammeR 将其呈现为 PDF 和 HTML 文档,所以这里的任何答案都应该与输出格式无关,以防万一.
有什么建议吗?我已尝试搜索 graphViz 文档,但无济于事,而且我找不到任何展示这些问题的有效示例。
为了改善节点的位置和边缘的形状(虽然这不是你想象的那样),使用constraint=false
:
E -> B [tailport="s", headport="s", constraint=false]
A
和 B
之间的 space 更棘手 - 等级分离在图和子图中是相同的。您可以插入一个不可见的节点来增加距离,尽管这可能不值得:
ranksep=0.2;
invisnode[style=invis, shape=point, width=0.2];
A -> invisnode [style=invis];
invisnode -> B [style=invis];
并使用 dir=back
:
反转从 B
到 A
的边的方向
A -> B [label = " ", headport="sw", tailport="se", dir=back]
我有一张图表,可以用英语概括为:
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"]
}
这是一种有效的渲染方式,但我想更正一些视觉上的问题。
- 我希望
A
和子图之间有更多的 space,子图的节点之间有更少的 space。 - 我希望
E
与其他节点处于同一垂直对齐方式。我希望D -> E
边缘是一条平线。 - 我希望
E -> B
边缘以更美观的方式弯曲。我希望它从E
的 's' 端口出来,向左转 90 度,继续向左直到到达节点B
,然后向上转 90 度,并垂直进入B
的's'端口。我相信这是因为 graphViz spaces 样条点的方式——我想我真正想做的是将每个中间样条点向下拖动一点,以便边缘的左行部分是平.
我曾尝试调整 nodesep
和 ranksep
参数来解决前两个问题,但无法始终如一地理解为什么我所做的更改会产生它们所做的更改。我根本无法解决#3。
此外,我在 R 中使用 diagrammeR 将其呈现为 PDF 和 HTML 文档,所以这里的任何答案都应该与输出格式无关,以防万一.
有什么建议吗?我已尝试搜索 graphViz 文档,但无济于事,而且我找不到任何展示这些问题的有效示例。
为了改善节点的位置和边缘的形状(虽然这不是你想象的那样),使用constraint=false
:
E -> B [tailport="s", headport="s", constraint=false]
A
和 B
之间的 space 更棘手 - 等级分离在图和子图中是相同的。您可以插入一个不可见的节点来增加距离,尽管这可能不值得:
ranksep=0.2;
invisnode[style=invis, shape=point, width=0.2];
A -> invisnode [style=invis];
invisnode -> B [style=invis];
并使用 dir=back
:
B
到 A
的边的方向
A -> B [label = " ", headport="sw", tailport="se", dir=back]