Graphviz 图形可视化教程 / 03 - DOT 语言基础
第 03 章 · DOT 语言基础
3.1 DOT 文件结构
一个完整的 DOT 文件由四部分组成:
// 1. 注释(可选)
// 单行注释
/* 多行
注释 */
// 2. 图声明
digraph MyGraph {
// 3. 全局属性(可选)
rankdir=TB
bgcolor="white"
// 4. 节点和边的声明
A -> B
B -> C
}
语法规则
| 规则 | 说明 | 示例 |
|---|---|---|
语句以 ; 或换行结束 | 分号可选 | A -> B; 或 A -> B |
| 标识符区分大小写 | A 和 a 不同 | — |
| 标识符可用引号包裹 | 包含特殊字符时必须 | "Node A" |
| ID 支持多种形式 | 数字/字母/引号/HTML | 42、"hello"、<BR/> |
属性用 [] 包裹 | 节点/边/图属性 | [color=red] |
3.2 有向图 (Digraph)
使用 digraph 声明,边用 -> 表示方向:
digraph Simple {
A -> B
B -> C
A -> C
}
有向图的隐式节点
不需要预先声明节点,首次出现在边中时自动创建:
digraph Implicit {
// A、B、C 会自动创建
A -> B -> C -> D
}
3.3 无向图 (Graph)
使用 graph 声明,边用 -- 表示:
graph Simple {
A -- B
B -- C
A -- C
}
有向图 vs 无向图
| 特性 | 有向图 digraph | 无向图 graph |
|---|---|---|
| 边符号 | -> | -- |
| 箭头 | 默认有箭头 | 默认无箭头 |
| 适用场景 | 流程图、依赖关系 | 网络拓扑、关系图 |
| 布局引擎 | dot(推荐) | neato、fdp(推荐) |
// 有向图 — 流程关系
digraph Flow {
rankdir=LR
node [shape=box style=filled fillcolor="#E3F2FD" color="#1976D2"]
需求分析 -> 设计 -> 编码 -> 测试 -> 部署
}
// 无向图 — 社交关系
graph Social {
node [shape=circle style=filled fillcolor="#E8F5E9" color="#388E3C"]
Alice -- Bob -- Charlie
Alice -- David
Charlie -- David
}
3.4 节点声明
基本语法
// 最简声明(自动创建,使用 ID 作为标签)
A
// 带属性的声明
A [label="节点 A" shape=box]
// 多个属性
A [label="节点 A" shape=box color=red style=filled fillcolor="#FFE0E0"]
节点 ID 规则
digraph NodeIDs {
// 合法的节点 ID
A // 字母开头
node1 // 字母数字
"Node with spaces" // 包含空格需引号
"123" // 纯数字需引号
"node:port" // 包含冒号需引号(否则解析为端口)
A -> "Node with spaces"
}
节点默认属性
使用 node 关键字设置后续节点的默认属性:
digraph Defaults {
// 所有后续节点使用此默认值
node [shape=box style=filled fillcolor="#E8EAF6" color="#3F51B5" fontname="Microsoft YaHei"]
A [label="盒子 A"]
B [label="盒子 B"]
C [label="盒子 C" shape=ellipse color="#F44336"] // 覆盖默认
A -> B -> C
}
3.5 边声明
基本语法
digraph Edges {
// 单条边
A -> B
// 链式边
A -> B -> C -> D
// 带属性的边
A -> B [label="连接" color=red style=dashed]
// 多条从同一节点出发的边
A -> {B C D} // A 指向 B、C、D
}
边默认属性
digraph EdgeDefaults {
// 设置所有边的默认属性
edge [color="#666666" fontname="Microsoft YaHei" fontsize=10]
A -> B [label="普通"]
B -> C [label="虚线" style=dashed]
C -> D [label="加粗" style=bold penwidth=2]
}
链式与分组
digraph ChainGroup {
// 链式连接
A -> B -> C -> D
// 等价于:
// A -> B
// B -> C
// C -> D
// 分组连接
A -> {X Y Z} [color=blue]
// 带属性的分组
{
rank=same // 同一层级
X Y Z
}
}
3.6 属性系统
属性基本语法
digraph Attributes {
// 图属性
bgcolor="#FAFAFA"
label="我的图"
rankdir=TB
// 节点属性默认值
node [shape=box color=blue]
// 边属性默认值
edge [color=gray style=dashed]
// 单个节点属性
A [label="特殊节点" color=red shape=ellipse]
// 单条边属性
A -> B [label="特殊边" color=green penwidth=3]
}
常用属性速查
图 (Graph) 属性
| 属性 | 说明 | 常用值 |
|---|---|---|
rankdir | 布局方向 | TB(上下)、LR(左右)、BT、RL |
bgcolor | 背景颜色 | "#FFFFFF"、"white"、"transparent" |
label | 图标题 | 任意文本 |
fontname | 全局字体 | "Microsoft YaHei" |
fontsize | 全局字号 | 12、14、16 |
dpi | 分辨率 | 72、96、150、300 |
pad | 边距 | 0.5 |
nodesep | 节点间距 | 0.5(默认) |
ranksep | 层级间距 | 0.5(默认) |
concentrate | 合并边 | true、false |
节点 (Node) 属性
| 属性 | 说明 | 常用值 |
|---|---|---|
label | 标签文本 | 任意文本 |
shape | 形状 | box、ellipse、circle、diamond |
style | 样式 | filled、rounded、dashed、bold |
fillcolor | 填充色 | "#E3F2FD"、"lightblue" |
color | 边框色 | "#1976D2"、"blue" |
fontname | 字体 | "Microsoft YaHei" |
fontsize | 字号 | 11、12 |
fontcolor | 字体颜色 | "black"、"#333333" |
width | 宽度(英寸) | 1.5 |
height | 高度(英寸) | 0.8 |
penwidth | 边框宽度 | 1、2、3 |
tooltip | 鼠标提示 | 任意文本(SVG) |
边 (Edge) 属性
| 属性 | 说明 | 常用值 |
|---|---|---|
label | 标签 | 任意文本 |
color | 颜色 | "#666666"、"red" |
style | 样式 | solid、dashed、dotted、bold |
penwidth | 线宽 | 1、2、3 |
arrowhead | 箭头样式 | normal、vee、diamond、none |
arrowtail | 尾部箭头 | 同上 |
dir | 方向 | forward、back、both、none |
constraint | 约束 | true、false |
weight | 权重 | 1(默认)、更大的值使边更直 |
fontname | 字体 | "Microsoft YaHei" |
fontsize | 字号 | 10 |
labelfontcolor | 标签颜色 | "#333333" |
3.7 完整示例
示例 1:简单流程图
digraph SimpleFlow {
rankdir=TB
bgcolor="#FFFFFF"
fontname="Microsoft YaHei"
node [fontname="Microsoft YaHei" fontsize=11]
edge [fontname="Microsoft YaHei" fontsize=9 color="#666666"]
开始 [shape=circle style=filled fillcolor="#E8F5E9" color="#388E3C" label="开始"]
判断 [shape=diamond style=filled fillcolor="#FFF3E0" color="#FF9800" label="条件\n满足?"]
执行A [shape=box style=filled fillcolor="#E3F2FD" color="#1976D2" label="执行操作 A"]
执行B [shape=box style=filled fillcolor="#E3F2FD" color="#1976D2" label="执行操作 B"]
结束 [shape=doublecircle style=filled fillcolor="#FFEBEE" color="#F44336" label="结束"]
开始 -> 判断
判断 -> 执行A [label="是" color="#4CAF50"]
判断 -> 执行B [label="否" color="#F44336"]
执行A -> 结束
执行B -> 结束
}
示例 2:网络拓扑图
graph Network {
bgcolor="#F5F5F5"
node [shape=box3d style=filled fillcolor="#E3F2FD" color="#1976D2" fontname="Microsoft YaHei"]
edge [color="#90A4AE" penwidth=1.5]
Router [label="路由器\n192.168.1.1"]
Switch1 [label="交换机 1"]
Switch2 [label="交换机 2"]
Server1 [shape=box label="Web 服务器\n192.168.1.10" fillcolor="#E8F5E9" color="#388E3C"]
Server2 [shape=box label="DB 服务器\n192.168.1.20" fillcolor="#E8F5E9" color="#388E3C"]
PC1 [shape=pc label="PC 1" fillcolor="#FFF3E0" color="#FF9800"]
PC2 [shape=pc label="PC 2" fillcolor="#FFF3E0" color="#FF9800"]
Router -- Switch1
Router -- Switch2
Switch1 -- Server1
Switch1 -- Server2
Switch2 -- PC1
Switch2 -- PC2
}
注意事项
⚠️ digraph 和 graph 不能混用:一个文件只能声明一种类型的图。
⚠️
->和--不能混用:有向图用->,无向图用--。
⚠️ 属性值中的空格:包含空格的值必须用引号包裹
label="Hello World"。
⚠️ 节点 ID 与标签不同:
A [label="B"]创建的是 ID 为A、标签显示为B的节点。
⚠️ 隐式声明的顺序:首次出现的节点会按遇到的顺序分配默认属性。
扩展阅读
下一章:04 - 节点详解 — 深入学习节点形状、样式和高级标签。