如何在自定义HTML样式的GraphViz/DiagrammeR节点中居中文本?
解决自定义节点中沙漏符号居中对齐问题
你用DiagrammeR绘制的逻辑增长模型图里,growth节点的沙漏符号(⧖)未垂直居中,导致连接的蓝色水平边和红色垂直边无法对齐到节点中间。以下是两种可行的解决方法:
方法一:优化HTML表格布局
通过给HTML表格的单元格添加对齐属性,并移除多余空行,确保沙漏符号和文本都居中:
修改后的完整代码:
library(DiagrammeR) graph <- " digraph logistic_growth { graph [rankdir = 'LR', bgcolor='none', fontsize=10] node [shape = circle, fontsize=8, penwidth=0.7, fontname='Open Sans'] r [xlabel=' intrinsic growth rate'] K [xlabel=' carrying capacity'] node [shape = box, penwidth=2] N [label='Population N'] node [shape = octagon, width='', penwidth=0.5, style='rounded', fixedsize=25] Source Sink node [shape=plaintext, width=0.3, height=0.3] growth [label=<<table cellpadding='0' border='0' cellspacing='0' align='center'> <tr><td valign='middle' align='center'><FONT POINT-SIZE='20'>⧖</FONT></td></tr> <tr><td valign='middle' align='center'>growth</td></tr> </table>>] edge [penwidth=1.5] Source -> growth [dir = none, color = 'blue' headclip=false] growth -> N [dir = left, color = 'blue' tailclip=false] N -> Sink edge [penwidth=0.7, tailport = 'n', headport = 'n', constraint = false, color=tomato] N -> growth edge [penwidth=0.7, tailport = 'e', headport = 'n', constraint = false, color=tomato] r -> growth K -> growth } " grViz(graph)
关键调整点:
- 移除原代码中高度为10的空行,避免整体布局偏移
- 给每个单元格添加
valign='middle'和align='center',强制内容垂直、水平居中 - 微调节点的
width和height参数,确保节点尺寸足够容纳居中内容
方法二:改用纯文本标签替代HTML表格
如果HTML布局仍有问题,可以直接用多行文本标签,借助Graphviz的原生换行和自动居中特性实现对齐:
library(DiagrammeR) graph <- " digraph logistic_growth { graph [rankdir = 'LR', bgcolor='none', fontsize=10] node [shape = circle, fontsize=8, penwidth=0.7, fontname='Open Sans'] r [xlabel=' intrinsic growth rate'] K [xlabel=' carrying capacity'] node [shape = box, penwidth=2] N [label='Population N'] node [shape = octagon, width='', penwidth=0.5, style='rounded', fixedsize=25] Source Sink # 改用圆形节点+多行标签,自动居中 node [shape=circle, fixedsize=true, width=0.5, height=0.5, fontname='Open Sans'] growth [label='⧖\ngrowth', fontsize=20] edge [penwidth=1.5] Source -> growth [dir = none, color = 'blue' headclip=false] growth -> N [dir = left, color = 'blue' tailclip=false] N -> Sink edge [penwidth=0.7, tailport = 'n', headport = 'n', constraint = false, color=tomato] N -> growth edge [penwidth=0.7, tailport = 'e', headport = 'n', constraint = false, color=tomato] r -> growth K -> growth } " grViz(graph)
这种方法无需手动调整HTML布局,适合快速解决对齐问题。
内容的提问来源于stack exchange,提问作者tpetzoldt
相关产品推荐
相关产品推荐

