强曰为道

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

01 - Graphviz 概述

第 01 章 · Graphviz 概述

1.1 什么是 Graphviz

Graphviz(Graph Visualization Software)是由 AT&T 实验室开发的开源图形可视化软件包。它的核心理念是:

用声明式语言描述图形的拓扑结构,让算法自动计算最优布局。

与手动拖拽绘图工具(如 Visio、draw.io)不同,Graphviz 让你专注于**“画什么”而非“怎么画”**。

核心优势

特性说明
声明式用文本描述结构,而非像素坐标
自动布局多种引擎自动计算节点位置
版本友好纯文本可 diff、可 merge
格式丰富输出 PNG/SVG/PDF/PS 等多种格式
可编程可通过脚本动态生成图形
开源免费Eclipse Public License

1.2 DOT 语言简介

DOT 是 Graphviz 使用的图形描述语言,语法极其简洁:

digraph G {
    A -> B -> C
    A -> C
}

这段代码描述了一个有向图:A 指向 B,B 指向 C,同时 A 也直接指向 C。

DOT 语言的三个核心元素

// 1. 图声明
digraph G { ... }   // 有向图
graph G { ... }     // 无向图

// 2. 节点声明与属性
A [label="节点A" shape=box]

// 3. 边声明与属性
A -> B [label="连接" color=red]

DOT 语法速查

语法含义示例
digraph { ... }有向图digraph G { A -> B }
graph { ... }无向图graph G { A -- B }
->有向边A -> B
--无向边A -- B
[key=value]属性A [shape=box]
subgraph { ... }子图subgraph cluster_0 { ... }
///* */注释// 这是注释

1.3 布局引擎概览

Graphviz 提供多种布局引擎,适用于不同类型的图形结构:

引擎算法类型适用场景特点
dot层次布局流程图、DAG、层次结构自上而下/自左而右分层
neato力导向布局小型无向图、网络拓扑弹簧模型,物理模拟
fdp力导向布局大型无向图neato 的改进版,性能更好
sfdp多尺度力导向超大型图分层力导向,处理数万节点
twopi放射布局树形结构、辐射关系根节点居中,向外辐射
circo圆形布局循环结构、环形拓扑节点沿圆弧排列
osage矩形布局层次分组矩形嵌套分组
patchwork矩形树图层次数据可视化面积编码层次关系

引擎选择流程图

digraph EngineGuide {
    rankdir=TB
    node [shape=box style=rounded fillcolor="#FFF3E0" color="#FF9800" fontname="Microsoft YaHei"]
    edge [color="#666666"]

    start [label="你的图形类型?" shape=diamond fillcolor="#E3F2FD" color="#1976D2"]
    directed [label="有向图/DAG\n流程图"]
    undirected [label="无向图"]
    tree [label="树形/层次"]
    circular [label="环形/循环"]
    large [label="节点数 > 1000?"]

    start -> directed [label="有向边"]
    start -> undirected [label="无向边"]
    start -> tree [label="树结构"]
    start -> circular [label="环形结构"]

    directed -> dot [label="推荐"]
    undirected -> large
    large -> fdp [label="是"]
    large -> neato [label="否"]
    tree -> twopi
    circular -> circo

    dot [fillcolor="#C8E6C9" color="#388E3C"]
    neato [fillcolor="#C8E6C9" color="#388E3C"]
    fdp [fillcolor="#C8E6C9" color="#388E3C"]
    twopi [fillcolor="#C8E6C9" color="#388E3C"]
    circo [fillcolor="#C8E6C9" color="#388E3C"]
}

1.4 适用场景

✅ 典型应用场景

场景说明推荐引擎
软件架构图模块依赖、微服务拓扑dot
流程图业务流程、审批链dot
状态机有限状态自动机(FSM)dot
网络拓扑服务器连接、网络设备neato/fdp
类图/ER图UML 类关系、数据库 ERdot
目录树文件系统、组织架构twopi
调用链函数调用关系、API 依赖dot
知识图谱实体关系网络fdp/sfdp
CI/CD 流水线构建阶段、依赖关系dot
决策树机器学习决策路径twopi

❌ 不适合的场景

场景原因替代方案
精确像素级排版自动布局无法精确控制Mermaid、draw.io
实时交互式图形Graphviz 是静态渲染D3.js、Cytoscape.js
3D 可视化仅支持 2DGephi、Three.js
超大图(>10万节点)布局算法性能瓶颈Gephi、Sigma.js

1.5 发展历史

时间事件
1991 年AT&T 实验室的 Stephen North 等人开始开发
1996 年DOT 语言规范首次公开发布
2000 年开始支持多种布局引擎(neato、twopi 等)
2004 年成为开源项目,采用 EPL 许可证
2007 年引入 HTML-like 标签(<TABLE> 等)
2013 年布局引擎 osage 和 patchwork 加入
2019 年Graphviz 2.42 发布,大规模代码重构
2021 年迁移至 GitHub,社区贡献活跃
2024 年持续维护,支持更多输出格式

设计哲学

Graphviz 遵循 Unix 哲学:

  1. 单一职责 — 每个布局引擎只做一件事
  2. 文本流 — 输入/输出均为文本,便于管道组合
  3. 可组合 — 可与 awksed、脚本语言无缝集成
# Unix 管道风格使用 Graphviz
echo 'digraph { A -> B -> C }' | dot -Tsvg > output.svg

1.6 第一个完整示例

让我们绘制一个简单的微服务架构图:

digraph Microservices {
    // 全局设置
    rankdir=TB
    bgcolor="#FAFAFA"
    fontname="Microsoft YaHei"
    node [fontname="Microsoft YaHei" fontsize=11]
    edge [fontname="Microsoft YaHei" fontsize=9]

    // 客户端
    subgraph cluster_clients {
        label="客户端"
        style=dashed
        color="#9E9E9E"
        WebApp [shape=box style=filled fillcolor="#E3F2FD" color="#1976D2" label="Web 应用"]
        MobileApp [shape=box style=filled fillcolor="#E3F2FD" color="#1976D2" label="移动 App"]
    }

    // 网关
    Gateway [shape=box3d style=filled fillcolor="#FFF3E0" color="#FF9800" label="API 网关"]

    // 服务
    subgraph cluster_services {
        label="微服务层"
        style=dashed
        color="#4CAF50"
        UserService [shape=component style=filled fillcolor="#E8F5E9" color="#388E3C" label="用户服务"]
        OrderService [shape=component style=filled fillcolor="#E8F5E9" color="#388E3C" label="订单服务"]
        PayService [shape=component style=filled fillcolor="#E8F5E9" color="#388E3C" label="支付服务"]
    }

    // 数据层
    subgraph cluster_data {
        label="数据层"
        style=dashed
        color="#9C27B0"
        MySQL [shape=cylinder style=filled fillcolor="#F3E5F5" color="#7B1FA2" label="MySQL"]
        Redis [shape=cylinder style=filled fillcolor="#F3E5F5" color="#7B1FA2" label="Redis"]
    }

    // 连接关系
    WebApp -> Gateway [label="HTTP"]
    MobileApp -> Gateway [label="HTTP"]
    Gateway -> UserService [label="gRPC"]
    Gateway -> OrderService [label="gRPC"]
    OrderService -> PayService [label="调用"]
    UserService -> MySQL [label="读写"]
    OrderService -> MySQL [label="读写"]
    UserService -> Redis [label="缓存"]
}

将以上代码保存为 microservices.dot,执行:

dot -Tpng microservices.dot -o microservices.png -Gdpi=150
dot -Tsvg microservices.dot -o microservices.svg

1.7 与其他工具对比

工具类型优点缺点
Graphviz声明式/自动布局版本控制友好、布局算法强精确排版困难
Mermaid声明式/自动布局Markdown 集成好图形类型有限
draw.io所见即所得直观、易上手不易版本控制
PlantUML声明式UML 支持全面依赖 Java
D3.js编程式高度可定制学习曲线陡
yEd桌面工具丰富的自动布局非文本格式

注意事项

⚠️ 编码问题:DOT 文件必须使用 UTF-8 编码,否则中文标签可能乱码。

⚠️ 特殊字符:节点标签中的 <>{}| 需要转义或使用 HTML 标签。

⚠️ 布局引擎差异:同一份 DOT 代码在不同引擎下效果完全不同,需根据场景选择。

⚠️ 有向图 vs 无向图digraph 使用 ->graph 使用 --,混用会报错。


扩展阅读


下一章02 - 安装与环境配置 — 在各平台安装 Graphviz 并配置开发环境。