DiagrammeR布局咨询:如何为末端分支设不同rankdir并垂直对齐节点
解决DiagrammeR流程图的两个布局需求
需求说明
- 整体流程图采用
rankdir=LR(从左到右)布局 - 需求1:将末端节点a2、a3的分支改为垂直布局(相对于a1从上到下排列)
- 需求2:让a2、a3与a1垂直对齐,且无需手动指定节点宽高
当前代码
library(DiagrammeR) grViz(" digraph G { graph [splines=ortho, nodesep=1, dpi=70] rankdir=LR node [shape=box, fontname=Helvetica]; {rank=same; x1; x3; y1 [shape = point, width = 0, height = 0]; } x2[fontsize=20,height=1.5,width=2]; x4; x5; x1 [label = 'a0']; x2 [label = 'b0']; x3 [label = 'a1']; x4 [label = 'a2']; x5 [label = 'a3']; x1 -> y1 [arrowhead=none] y1 -> x2 y1 -> x3 x3 -> {x4, x5} } ")
当前输出效果
a1(x3)位于右侧,a2(x4)、a3(x5)水平排列在a1的右侧,整体为横向延伸的布局。
期望输出效果
a1(x3)位于左侧,a2(x4)在a1正下方,a3(x5)在a2正下方,三者垂直对齐,形成纵向分支。
修改后的代码
library(DiagrammeR) grViz(" digraph G { graph [splines=ortho, nodesep=0.5, dpi=70] rankdir=LR node [shape=box, fontname=Helvetica]; {rank=same; x1; x3; y1 [shape = point, width = 0, height = 0]; } # 让中间点y2与a1同rank,保证垂直对齐 {rank=same; x3; y2 [shape = point, width = 0, height = 0]; } x2[fontsize=20,height=1.5,width=2]; x4; x5; x1 [label = 'a0']; x2 [label = 'b0']; x3 [label = 'a1']; x4 [label = 'a2']; x5 [label = 'a3']; x1 -> y1 [arrowhead=none] y1 -> x2 y1 -> x3 # 通过中间点转向垂直布局 x3 -> y2 [arrowhead=none] y2 -> x4 x4 -> x5 } ")
关键改动说明
- 新增无形点节点
y2,并将其与x3(a1)设置为同一rank,确保后续分支与a1严格垂直对齐 - 将原横向分支
x3 -> {x4, x5}改为通过y2转向纵向连接,实现末端节点的垂直排列 - 微调
nodesep值优化节点间距,全程无需手动指定节点宽高
内容的提问来源于stack exchange,提问作者SRL
相关产品推荐
相关产品推荐

