Graphviz 图形可视化教程 / 04 - 节点详解
第 04 章 · 节点详解
4.1 节点形状 (Shape)
Graphviz 提供丰富的内置形状,通过 shape 属性设置。
常用形状一览
| 形状名 | 说明 | 典型场景 |
|---|---|---|
box | 矩形 | 流程步骤、模块 |
box3d | 3D 立方体 | 数据库、服务器 |
polygon | 多边形 | 通用 |
ellipse | 椭圆(默认) | 开始/结束节点 |
oval | 椭圆 | 同 ellipse |
circle | 正圆 | 状态节点 |
doublecircle | 双圆 | 终止状态 |
diamond | 菱形 | 判断/条件 |
trapezium | 梯形 | 输入/输出 |
parallelogram | 平行四边形 | 数据 |
hexagon | 六边形 | 准备/预处理 |
octagon | 八边形 | 中断 |
pentagon | 五边形 | — |
house | 房形 | 子程序入口 |
invhouse | 倒房形 | 子程序出口 |
cylinder | 圆柱 | 数据库、存储 |
note | 便签 | 注释 |
tab | 标签页 | HTML 页面 |
folder | 文件夹 | 文件系统 |
component | 组件 | UML 组件 |
record | 记录 | 结构体 |
Mrecord | 圆角记录 | 同上,圆角 |
plaintext | 纯文本 | 无边框标签 |
point | 点 | 连接点 |
star | 星形 | 重要节点 |
underline | 下划线文本 | 纯文本 |
none | 无形状 | 隐藏节点 |
plain | 纯文本 | 同 plaintext |
形状展示图
digraph Shapes {
rankdir=LR
node [fontname="Microsoft YaHei" fontsize=10 style=filled]
edge [style=invis] // 隐藏边,仅用于排列
box [shape=box label="box\n矩形" fillcolor="#E3F2FD" color="#1976D2"]
ellipse [shape=ellipse label="ellipse\n椭圆" fillcolor="#E8F5E9" color="#388E3C"]
circle [shape=circle label="circle\n正圆" fillcolor="#E8F5E9" color="#388E3C"]
diamond [shape=diamond label="diamond\n菱形" fillcolor="#FFF3E0" color="#FF9800"]
cylinder [shape=cylinder label="cylinder\n圆柱" fillcolor="#F3E5F5" color="#7B1FA2"]
hexagon [shape=hexagon label="hexagon\n六边形" fillcolor="#FFEBEE" color="#C62828"]
parallelogram [shape=parallelogram label="parallelogram\n平行四边形" fillcolor="#E0F7FA" color="#00838F"]
trapezium [shape=trapezium label="trapezium\n梯形" fillcolor="#FFF8E1" color="#F57F17"]
star [shape=star label="star\n星形" fillcolor="#FCE4EC" color="#AD1457"]
note [shape=note label="note\n便签" fillcolor="#FFFDE7" color="#F9A825"]
box -> ellipse -> circle -> diamond -> cylinder
cylinder -> hexagon -> parallelogram -> trapezium -> star -> note
}
4.2 节点样式 (Style)
通过 style 属性组合多种视觉效果:
样式属性值
| 样式值 | 效果 | 说明 |
|---|---|---|
filled | 填充背景色 | 需配合 fillcolor |
rounded | 圆角矩形 | 仅对 box 有效 |
dashed | 虚线边框 | — |
dotted | 点线边框 | — |
bold | 加粗边框 | — |
solid | 实线边框 | 默认 |
filled,rounded | 圆角+填充 | 组合使用 |
diagonals | 对角线装饰 | — |
striped | 条纹填充 | 多色条纹 |
wedged | 楔形填充 | 渐变效果 |
invis | 不可见 | 隐藏节点 |
样式组合示例
digraph NodeStyles {
node [fontname="Microsoft YaHei" fontsize=11]
// 基本样式
default [label="默认"]
filled [label="filled\n填充" style=filled fillcolor="#E3F2FD"]
rounded [label="rounded\n圆角" style="filled,rounded" fillcolor="#E8F5E9"]
dashed [label="dashed\n虚线" style=dashed]
bold [label="bold\n加粗" style=bold penwidth=2]
// 组合样式
combo1 [label="filled+rounded+dashed" style="filled,rounded,dashed" fillcolor="#FFF3E0"]
combo2 [label="filled+bold" style="filled,bold" fillcolor="#FFEBEE" penwidth=3]
// 高级样式
striped [label="striped\n条纹" style=striped fillcolor="#E3F2FD:#E8F5E9"]
wedge [label="wedged\n楔形" style=wedged fillcolor="#1976D2:#388E3C"]
default -> filled -> rounded -> dashed -> bold
bold -> combo1 -> combo2 -> striped -> wedge
}
4.3 节点标签 (Label)
基本标签
digraph Labels {
// 默认标签 = 节点 ID
A // 标签显示 "A"
// 自定义标签
B [label="自定义标签"]
// 多行标签(使用 \n)
C [label="第一行\n第二行\n第三行"]
}
标签中的特殊字符
需要转义或引号包裹的字符:
| 字符 | 转义方式 | 说明 |
|---|---|---|
{ } | "\{" "\}" 或用引号 | Record 中有特殊含义 |
< > | 使用 HTML 标签 | 开启 HTML 标签模式 |
| ` | ` | "|" |
" | "\"" | 引号本身 |
\ | "\\" | 反斜杠 |
| 换行 | \n | 多行文本 |
4.4 HTML 标签 (HTML-Like Labels)
Graphviz 支持使用 HTML 语法创建复杂标签,用 < 和 > 包裹(不是 ")。
基本 HTML 标签
digraph HTMLLabels {
node [fontname="Microsoft YaHei"]
// HTML 标签 — 注意用 < > 而非 " "
simple [label=<简单<b>粗体</b>文本>]
// 表格布局
table [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="8">
<TR>
<TD COLSPAN="2" BGCOLOR="#1976D2"><FONT COLOR="white"><B>用户信息</B></FONT></TD>
</TR>
<TR>
<TD>姓名</TD>
<TD>张三</TD>
</TR>
<TR>
<TD>年龄</TD>
<TD>28</TD>
</TR>
</TABLE>
>]
simple -> table
}
HTML 标签参考
| HTML 标签 | 说明 | 常用属性 |
|---|---|---|
<B>...</B> | 粗体 | — |
<I>...</I> | 斜体 | — |
<U>...</U> | 下划线 | — |
<O>...</O> | 上划线 | — |
<S>...</S> | 删除线 | — |
<SUB>...</SUB> | 下标 | — |
<SUP>...</SUP> | 上标 | — |
<BR/> | 换行 | — |
<FONT> | 字体 | FACE、SIZE、COLOR |
<IMG> | 图片 | SRC、SCALE |
<TABLE> | 表格 | BORDER、CELLBORDER、CELLSPACING、CELLPADDING |
<TR> | 行 | VALIGN、BGCOLOR |
<TD> | 单元格 | COLSPAN、ROWSPAN、BGCOLOR、ALIGN、PORT |
<HR/> | 水平线 | — |
HTML 表格详解
digraph HTMLTable {
node [fontname="Microsoft YaHei" shape=plain]
// 复杂表格示例
record [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="6">
<TR>
<TD COLSPAN="3" BGCOLOR="#4CAF50">
<FONT COLOR="white" POINT-SIZE="14"><B>系统架构</B></FONT>
</TD>
</TR>
<TR>
<TD BGCOLOR="#E3F2FD" PORT="frontend">
<B>前端层</B><BR/>
<FONT POINT-SIZE="9">React / Vue</FONT>
</TD>
<TD BGCOLOR="#E8F5E9" PORT="backend">
<B>后端层</B><BR/>
<FONT POINT-SIZE="9">Go / Java</FONT>
</TD>
<TD BGCOLOR="#F3E5F5" PORT="data">
<B>数据层</B><BR/>
<FONT POINT-SIZE="9">MySQL / Redis</FONT>
</TD>
</TR>
<TR>
<TD COLSPAN="3" BGCOLOR="#FFF3E0">
<FONT POINT-SIZE="9">基础设施:Docker + Kubernetes</FONT>
</TD>
</TR>
</TABLE>
>]
client [label="客户端" shape=box style=rounded]
client -> record:frontend [label="HTTP"]
client -> record:backend [label="API"]
}
4.5 Record 形状
record 和 Mrecord 形状用于表示结构化数据,使用 | 分隔字段。
基本 Record
digraph RecordDemo {
node [fontname="Microsoft YaHei" fontsize=11]
// record 形状 — 用 | 分隔字段
struct [shape=record label="<f0> 左侧 |<f1> 中间 |<f2> 右侧"]
// 带标题的 record
titled [shape=record label="{标题|{<f0> 字段1|<f1> 字段2|<f2> 字段3}}"]
// Mrecord — 圆角版本
rounded_rec [shape=Mrecord label="<f0> 圆角记录|<f1> 字段"]
}
Record 字段方向
{} 控制字段排列方向:
- 外层
{...}→ 行(水平排列) - 内层
{...}→ 列(垂直排列)
digraph RecordFields {
node [shape=record fontname="Microsoft YaHei"]
// 横向排列(用 | 分隔)
horizontal [label="A | B | C"]
// 纵向排列(用 {} 包裹)
vertical [label="{{ A }|{ B }|{ C }}"]
// 混合布局
mixed [label="{
标题 |
{
行1左 | 行1右
} |
{
行2左 | 行2右
}
}"]
}
Record 端口连接
digraph RecordPorts {
node [shape=record fontname="Microsoft YaHei"]
struct1 [label="{<f0> 头部|<f1> 数据|<f2> 尾部}"]
struct2 [label="{<f0> 输入|<f1> 处理|<f2> 输出}"]
// 通过 端口名 连接
struct1:f2 -> struct2:f0 [label="传输"]
struct1:f1 -> struct2:f1 [label="直接连接" style=dashed]
}
4.6 端口 (Port)
端口允许精确控制边连接到节点的哪个位置。
位置端口
digraph PositionPorts {
node [shape=box style=filled fillcolor="#E3F2FD" fontname="Microsoft YaHei"]
center [label="中心节点"]
top [label="上方"]
bottom [label="下方"]
left [label="左边"]
right [label="右边"]
// 使用 :port 语法
center -> top [taillabel="n" headport=n]
center -> bottom [taillabel="s" headport=s]
center -> left [taillabel="w" headport=w]
center -> right [taillabel="e" headport=e]
}
端口方向
| 端口 | 方向 | 说明 |
|---|---|---|
n | 北(上) | 节点顶部中心 |
s | 南(下) | 节点底部中心 |
e | 东(右) | 节点右侧中心 |
w | 西(左) | 节点左侧中心 |
ne | 东北 | 右上角 |
nw | 西北 | 左上角 |
se | 东南 | 右下角 |
sw | 西南 | 左下角 |
c | 中心 | 节点中心 |
Record 端口 vs 位置端口
digraph PortTypes {
node [fontname="Microsoft YaHei"]
// Record 端口
rec [shape=record label="{<in> 输入|处理|<out> 输出}"]
// HTML 端口
html [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD PORT="in">输入</TD><TD>处理</TD><TD PORT="out">输出</TD></TR>
</TABLE>
>]
// 外部节点
input [shape=box label="数据源"]
output [shape=box label="目标"]
input -> rec:in
rec:out -> html:in
html:out -> output
}
4.7 节点尺寸控制
digraph NodeSize {
node [fontname="Microsoft YaHei" style=filled fillcolor="#E3F2FD" color="#1976D2"]
// 固定宽高(英寸)
fixed [label="固定大小\nwidth=2\nheight=1" width=2 height=1]
// 最小宽度/高度
min [label="最小尺寸\n0.5x0.5" fixedsize=true width=0.5 height=0.5]
// 自适应(默认)
auto [label="自适应大小\n节点根据内容调整"]
fixed -> min -> auto
}
| 属性 | 说明 | 默认值 |
|---|---|---|
width | 宽度(英寸) | 根据内容 |
height | 高度(英寸) | 根据内容 |
fixedsize | 是否固定尺寸 | false(自适应) |
margin | 内边距 | 0.11, 0.055 |
4.8 业务场景:UML 类图
digraph UMLClass {
rankdir=TB
node [shape=plain fontname="Microsoft YaHei"]
edge [fontname="Microsoft YaHei" fontsize=9]
// 基类
Animal [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR><TD BGCOLOR="#E8EAF6"><B>Animal</B></TD></TR>
<TR><TD ALIGN="LEFT">
# name: String<BR/>
# age: int<BR/>
</TD></TR>
<TR><TD ALIGN="LEFT">
+ getName(): String<BR/>
+ makeSound(): void<BR/>
</TD></TR>
</TABLE>
>]
// 子类
Dog [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR><TD BGCOLOR="#C8E6C9"><B>Dog</B></TD></TR>
<TR><TD ALIGN="LEFT">- breed: String</TD></TR>
<TR><TD ALIGN="LEFT">+ fetch(): void</TD></TR>
</TABLE>
>]
Cat [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR><TD BGCOLOR="#C8E6C9"><B>Cat</B></TD></TR>
<TR><TD ALIGN="LEFT">- indoor: boolean</TD></TR>
<TR><TD ALIGN="LEFT">+ purr(): void</TD></TR>
</TABLE>
>]
// 继承关系(空心三角箭头)
Dog -> Animal [arrowhead=empty label="extends"]
Cat -> Animal [arrowhead=empty label="extends"]
}
注意事项
⚠️ Record vs HTML 标签:HTML 标签功能更强大,推荐新项目优先使用 HTML 标签。
⚠️ Record 中的特殊字符:
{、}、|、<、>在 Record 标签中有特殊含义,需转义。
⚠️ HTML 标签不用引号:
label=<...>而不是label="<...>"。
⚠️ fixedsize=true:设置固定尺寸时,如果文本太长会被截断,需手动调整。
⚠️ 字体渲染:不同操作系统对同一字体名的渲染可能不同。
扩展阅读
下一章:05 - 边详解 — 深入学习边的箭头、标签和约束。