DiagrammeR流程图节点水平对齐问题求助(附R可复现代码)
R语言流程图代码修改方案
修改后的完整代码
library(DiagrammeR) library(DiagrammeRsvg) library(magrittr) library(rsvg) library(tidyverse) flowchart = grViz("digraph flowchart { graph [rankdir = LR, nodesep=0.5, ranksep=0.8] 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'] # 让节点3、4处于对应矩形节点正中间 {rank=same; R1; A1; A2;} {rank=same; R2; B1; B2;} {rank=same; R3; C1; C2;} {rank=same; R4; D1; D2;} # 节点间无箭头连接 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'] # 让A1、C2与对应Y节点水平对齐 {rank=same; A1; IA1;} {rank=same; C2; IA2;} } 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'] # 保证跨子图箭头水平对齐 {rank=same; IA1; A1_Y;} {rank=same; IA2; C2_Y;} edge[len = 0.01, arrowhead = vee, label = '']; IA1 -> A1_Y; IA2 -> C2_Y; edge[style='invisible', dir='none']; A2 -> IA3; {B1 B2} -> IA4; C1 -> IA5; {D1 D2} -> Final; } } ") flowchart
调整细节说明
- 节点3、4居中:给每组圆形节点和对应矩形节点添加
rank=same约束,比如{rank=same; R3; C1; C2;},强制它们处于同一水平层级,Graphviz会自动将圆形节点放置在两个矩形节点的正中间,和R1、R2的布局保持一致。 - A1、C2与Y节点对齐:给A1和IA1、C2和IA2分别设置
rank=same,确保它们在同一水平线上,实现精准对齐。 - 跨子图箭头水平:在第二个子图中,给IA1和A1_Y、IA2和C2_Y添加
rank=same约束,让跨子图的节点处于同一水平层级,连接箭头会自动变为水平方向,保证"A1-Y-A1"、"C2-Y-C2"的水平线布局。
内容的提问来源于stack exchange,提问作者alittleboy
相关产品推荐
相关产品推荐

