我正在寻找一种方法来使graphviz中的各个节点与整个子图/群集对齐。
我目前正在教一个小的分析团队使用rmarkdown
,我希望允许他们在文档中包含简单的图形和流程图。因此,我使用DiagrammeR
(和viz.js
)来渲染用dot
编写的图表。为了提高用户的接受度,我想最小化复杂性并避免使用HTML
,而使用 raw dot
。
我们的问题是我们经常尝试将节点与包含多个节点的子图/群集对齐,但是我们无法将整个子图与该节点对齐。对齐仅适用于子图/群集内的组成节点。 (请参见下面的节点 C,D,E 和 G,T )
我尝试使用GT [shape = record label="{G | T}"]
创建一个记录节点,但这不允许两个节点的样式分别。
我也尝试过创建一个HTML记录节点,该节点允许单独设置样式,但会增加太多复杂性,并要求用户了解HTML。
最后,我尝试在群集内插入一个不可见节点以“模拟”中心,然后使用不可见节点进行对齐。不幸的是,这将 G 和 T 推开很远,无法达到预期的效果。
digraph G {
graph [splines = false, ranksep = 0.2]
edge [style = "invis"]
node [shape = box, width = 7.5]
A B H
node [shape = circle, width = 1.5]
subgraph cluster_2 {
rank = same
C D E
}
subgraph cluster_1 {
G [shape = box]
T [shape = box]
}
A -> B
G -> T
B -> {C D E G}
{C D E T} -> H
}
以下给出了输出:
在上图中,包含 G 和 T 的子图与包含 C,D,E 的子图不对齐。
有没有办法垂直对齐两个子图的中心?
答案 0 :(得分:0)
问题在于GraphViz仅对齐节点行,{C D E}是一行,而{G-> T}是两行,因此{C D E}只能与G或T对齐
您可以将{C D E}与G和T之间的间距对齐,尽管这可能不是您想要的。例如。像这样:
digraph G {
graph [splines = false, ranksep = 0.2]
//edge [style = "invis"]
node [shape = box, width = 7.5]
A B H
node [shape = circle, width = 1.5]
subgraph cluster_2 {
rank = same
C D E
}
subgraph cluster_1 {
G [shape = box]
T [shape = box]
}
A -> B
G -> T[minlen=2]
B -> G
B -> {C D E} -> H [minlen=2]
T -> H
}
结果: