将不同的 grViz 组合成一个图

Combine different grViz into a single plot

我想将不同的 DiagrammeR 图组合成一个图。生成的图如下例所示:

library(DiagrammeR)
pDia <- grViz("
digraph boxes_and_circles {

  # a 'graph' statement
  graph [overlap = true, fontsize = 10]

  # several 'node' statements
  node [shape = box,
        fontname = Helvetica]
  A; B; C; D; E; F

  node [shape = circle,
        fixedsize = true,
        width = 0.9] // sets as circles
  1; 2; 3; 4; 5; 6; 7; 8

  # several 'edge' statements
  A->1 B->2 B->3 B->4 C->A
  1->D E->A 2->4 1->5 1->F
  E->6 4->6 5->7 6->7 3->8
}
")

pDia

因此,我想将 pDia、class "grViz" "htmlwidget" 等图组合成一个带有标签 AB 和很快。我尝试使用 exportSVG 函数导出绘图的 svg 文件。因此,可以使用 magick 包来导入和处理这种 class(即 "grViz" "htmlwidget")的不同地块。但是,此功能在 DiagrammeR 软件包的较新版本中不可用。有什么想法可以将这些图组合成一个可以导出到图形文件的图形,例如 pdftiff?

也许以下方法之一适合您的需要。

  1. 您可以添加 additional/disconnected 个图表,只需将它们添加到同一个 digraph 调用即可。例如,我们可以通过在另一个图之后添加节点和边来在图的右侧添加另外两个图(U -> V -> W 和 X -> Y -> Z);您只需要确保节点的名称与前面图中的节点不同。但是,这可能会导致大型复杂脚本,并且可能不适合您的工作流程。
library(DiagrammeR)
pDia <- grViz("
digraph boxes_and_circles {

  # your existing graph here

  # 2nd graph
  U -> V -> W;
  
  # 3rd graph
  X -> Y -> Z;
}")

  1. 鉴于您想要静态输出,直接进入 graphviz. One way to combine graphs is by adding them as images to existing nodes. For example, if you have two graphs saved as png (other formats):
  2. 可能更容易
cat(file="so-65040221.dot", 
" 
digraph boxes_and_circles {
  graph [overlap = true, fontsize = 10]
  node [shape = box, fontname = Helvetica]
  A; B; C; D; E; F
  node [shape = circle, fixedsize = true, width = 0.9] 
  1; 2; 3; 4; 5; 6; 7; 8
  A->1 B->2 B->3 B->4 C->A
  1->D E->A 2->4 1->5 1->F
  E->6 4->6 5->7 6->7 3->8
}")

# This will write out two pngs. We will use these as examples for us to combine
system("dot -Tpng -Gdpi=300 so-65040221.dot -o so-65040221A.png -o so-65040221B.png")

然后创建一个新图来读取 png 并将它们添加到节点

cat(file="so-65040221-combine.dot", 
'graph {
        node [shape=none]
        a [label="", image="so-65040221A.png"];
        b [label="", image="so-65040221B.png"];
}')

我们执行此操作并输出为 pdf

system("dot -Tpdf so-65040221-combine.dot > so-65040221-combine.pdf")
# or output tiff etc
# system("dot -Ttif so-65040221-combine.dot > so-65040221-combine.tiff")

然后您可以通过在组合脚本中排列节点的方式来排列多个图表。