如何将节点与群集的中心垂直对齐?

时间:2019-11-07 20:31:27

标签: graphviz diagrammer

我正在寻找一种方法来使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 的子图不对齐。

有没有办法垂直对齐两个子图的中心?

1 个答案:

答案 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
}

结果:

enter image description here