强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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
标识符区分大小写 Aa 不同
标识符可用引号包裹 包含特殊字符时必须 "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(左右)、BTRL
bgcolor 背景颜色 "#FFFFFF""white""transparent"
label 图标题 任意文本
fontname 全局字体 "Microsoft YaHei"
fontsize 全局字号 121416
dpi 分辨率 7296150300
pad 边距 0.5
nodesep 节点间距 0.5(默认)
ranksep 层级间距 0.5(默认)
concentrate 合并边 truefalse

节点 (Node) 属性

属性 说明 常用值
label 标签文本 任意文本
shape 形状 boxellipsecirclediamond
style 样式 filledroundeddashedbold
fillcolor 填充色 "#E3F2FD""lightblue"
color 边框色 "#1976D2""blue"
fontname 字体 "Microsoft YaHei"
fontsize 字号 1112
fontcolor 字体颜色 "black""#333333"
width 宽度(英寸) 1.5
height 高度(英寸) 0.8
penwidth 边框宽度 123
tooltip 鼠标提示 任意文本(SVG)

边 (Edge) 属性

属性 说明 常用值
label 标签 任意文本
color 颜色 "#666666""red"
style 样式 soliddasheddottedbold
penwidth 线宽 123
arrowhead 箭头样式 normalveediamondnone
arrowtail 尾部箭头 同上
dir 方向 forwardbackbothnone
constraint 约束 truefalse
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 - 节点详解 — 深入学习节点形状、样式和高级标签。