具有子图内和子图之间节点水平对齐的DiagrammeR流程图

ali*_*boy 3 r graphviz diagrammer

我需要创建一个流程图,下面是一个可重现的示例R

    library(DiagrammeR)
    library(DiagrammeRsvg)
    library(magrittr)
    library(rsvg)
    library(tidyverse)

    flowchart = grViz("digraph flowchart {
                  
      graph [rankdir = LR]

      subgraph cluster_one {
      peripheries=1

      label = 'Procedure 1';
      style = solid;
      fontname = 'helvetica-bold';
      
      node [fontname = Helvetica, shape = circle,  style=solid]
      R1 [label = '1']; R2 [label = '2']; R3 [label = '3']; R4 [label = '4']
      
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      A1 [label = 'A1']
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      A2 [label = 'A2']
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      B1 [label = 'B1'] 
      node [fontname = Helvetica, shape = rectangle, style=filled]
      B2 [label = 'B2']
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      C1 [label = 'C1']
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      C2 [label = 'C2']
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      D1 [label = 'D1']
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      D2 [label = 'D2']
      
      # edge definitions with the node IDs
      edge[len = 0.01, arrowhead = none];
      R1 -> {A1 A2}; R2 -> {B1 B2};
      R3 -> {C1 C2}; R4 -> {D1 D2};
      
      node [fontname = Helvetica, shape = diamond, style=solid]
      IA1 [label = 'Y']; IA2 [label = 'Y'];
      node [fontname = Helvetica, shape = diamond, style=dashed]
      IA3 [label = 'N']; IA5 [label = 'N'];
      node [fontname = Helvetica, shape = oval, style=dashed]
      IA4 [label = 'N'];
      node [fontname = Helvetica, shape = oval, style=filled]
      Final [label = 'GO']
      }

      subgraph cluster_two {
      peripheries=1

      label = 'Procedure 2';
      style = solid;
      fontname = 'helvetica-bold';
      
      node [fontname = Helvetica, shape = rectangle, style=filled]
      A1_Y [label = 'A1']
      node [fontname = Helvetica, shape = rectangle, style=filled]
      C2_Y [label = 'C2']
      
      edge[len = 0.01, arrowhead = vee, label = ''];
      IA1 -> A1_Y; 
      IA2 -> C2_Y;
      
      edge[style='invisible', dir='none'];
      A1 -> IA1; C2 -> IA2; A2 -> IA3; 
      {B1 B2} -> IA4; C1 -> IA5; {D1 D2} -> Final;
      }
   }
             ")
       flowchart
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

在此输入图像描述

我正在寻求帮助来修改代码以实现以下更改(全部以红色标记):

  1. 对于节点 3 和 4:它们如何分别像节点 1 和 2 那样位于 C1 和 C2 之间以及 D1 和 D2 之间的中间?目前节点 3 有点下降,而节点 4 有点上升......
  2. 对于节点A1和C2来说,它们对应的决策是菱形的“Y”——如何将A1与“Y”水平对齐,以及如何将C2与“Y”水平对齐?
  3. 对于程序1中的“Y”箭头到程序2中的节点A1和C2,如何水平对齐它们,使得两个子图的“A1”“Y”“A1”在同一行,而“C2” “Y”“C2”跨越的两个子图是否在同一条线上?

非常感谢!

小智 5

添加不可见的节点和边:

library(DiagrammeR)
library(DiagrammeRsvg)
library(magrittr)
library(rsvg)
library(tidyverse)

flowchart = grViz("digraph flowchart {
                  
      graph [rankdir = LR]

      subgraph cluster_one {
      peripheries=1

      label = 'Procedure 1';
      style = solid;
      fontname = 'helvetica-bold';
      
      node [fontname = Helvetica, shape = circle,  style=solid]
      R1 [label = '1']; R2 [label = '2']; R3 [label = '3']; R4 [label = '4']; R5 [label = '', style = invis ]; R6[label = '', style = invis ]; R7[label = '', style = invis ];
      
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      A1 [label = 'A1']
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      A2 [label = 'A2']
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      B1 [label = 'B1'] 
      node [fontname = Helvetica, shape = rectangle, style=filled]
      B2 [label = 'B2']
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      C1 [label = 'C1']
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      C2 [label = 'C2']
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      D1 [label = 'D1']
      node [fontname = Helvetica, shape = rectangle, style=filled] 
      D2 [label = 'D2']
      
      # edge definitions with the node IDs
      edge[len = 0.01, arrowhead = none];
      R1 -> {A1 A2}; R2 -> {B1 B2};
      R3 -> {C1 C2}; R4 -> {D1 D2};
      
      node [fontname = Helvetica, shape = diamond, style=solid]
      IA1 [label = 'Y']; IA2 [label = 'Y'];
      node [fontname = Helvetica, shape = diamond, style=dashed]
      IA3 [label = 'N']; IA5 [label = 'N'];
      node [fontname = Helvetica, shape = oval, style=dashed]
      IA4 [label = 'N'];
      node [fontname = Helvetica, shape = oval, style=filled]
      Final [label = 'GO']
      
      edge[style='invisible', dir='none'];
      {rank=same; R4 -> R5 -> R3 -> R6 -> R2 -> R7 -> R1}
      }
      
      subgraph cluster_two {
      peripheries=1

      label = 'Procedure 2';
      style = solid;
      fontname = 'helvetica-bold';
      
      node [fontname = Helvetica, shape = rectangle, style=filled]
      A1_Y [label = 'A1']
      node [fontname = Helvetica, shape = rectangle, style=filled]
      C2_Y [label = 'C2']
      T1 [label = 'T1', style = invis]; T2 [label = 'T2', style = invis];
      
      edge[len = 0.01, arrowhead = vee, label = ''];
      IA1 -> A1_Y; 
      IA2 -> C2_Y;
      
      edge[style='invisible', dir='none'];
      A1 -> IA1; C2 -> IA2; A2 -> IA3; 
      {B1 B2} -> IA4; C1 -> IA5; {D1 D2} -> {Final};
      {rank=same; C2_Y -> T1 -> T2 -> A1_Y}
      }
   }
             ")
flowchart
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述