我有一个可以用英语概括的图形:
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
和子图之间有更多的空间,而子图的节点之间有更少的空间。E
与其他节点处于相同的垂直对齐方式。我希望D -> E
的边缘是一条平坦的线。E -> B
的边缘以更美观的方式弯曲。我希望它从E
的's'端口出来,向左转90度,继续向左直到到达节点B
,然后向上向90度转一圈,然后输入B
的's'端口以垂直方式。我相信发生这种情况是由于graphViz间隔了样条曲线点的方式-我想我实际上想做的是将每个中间样条曲线点向下拖动一点,以使边缘的左行部分平坦。我尝试调整nodesep
和ranksep
参数来解决前两个问题,但无法始终如一地理解为什么我所做的更改会产生它们所做的更改。我根本无法解决#3。
此外,我在R中使用 diagrammeR 将其呈现为PDF和HTML文档,因此,如果有必要,此处的任何答案都应与输出格式无关。
有什么建议吗?我曾尝试搜索graphViz文档无济于事,但找不到任何能解决这些问题的可行示例。
答案 0 :(得分:1)
要改善节点的位置和边缘的形状(尽管这并非您想象的那样),请使用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]