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

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 支持多种形式数字/字母/引号/HTML42"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 - 节点详解 — 深入学习节点形状、样式和高级标签。