Mermaid
适用读者:希望在 Markdown、GitHub、VS Code、技术文档和科研笔记中快速绘图的初学者。
学习目标:理解 Mermaid 的工作方式,掌握常用语法,能独立绘制并导出流程图、时序图、状态图、类图和甘特图。
使用方式:在支持 Mermaid 的 Markdown 阅读器中打开此文件,下面标注为mermaid的代码块会显示为图形。若只显示代码,参见第 12 节。
目录
- Mermaid 是什么
- 快速上手:第一张流程图
- 流程图基础:方向、节点与连线
- 流程图进阶:分组、布局与配色
- 时序图:表达消息交互
- 状态图:表达状态转换
- 类图:表达软件结构
- ER 图:表达数据库关系
- 甘特图:表达项目进度
- 其他常用图:饼图、思维导图和时间线
- 完整案例:无线通信系统处理链
- 在 Markdown 中显示与导出图表
- 常见错误及排查
- 速查表、练习与官方资料
1. Mermaid 是什么
Mermaid 是一种文本驱动的图表描述语言:你编写图表结构,Mermaid 根据代码自动生成图形。它很适合版本管理,因为改动可以像普通文本一样在 Git 中比较。
一个 Mermaid 图表通常分为三层:
- 声明图类型:例如
flowchart、sequenceDiagram、stateDiagram-v2。 - 定义参与元素:例如节点、对象、状态、任务。
- 定义关系和样式:例如箭头、消息、转换条件、颜色。
在 Markdown 里,Mermaid 代码通常放在下面这样的围栏代码块中:
1 | ```mermaid |
重要:
mermaid是代码块的语言标识;如果写成普通的text代码块,大多数 Markdown 阅读器不会把它当成 Mermaid 图表。
Mermaid 适合哪些场景?
| 任务 | 推荐图表类型 | 主要用途 |
|---|---|---|
| 展示算法模块关系 | flowchart |
处理流程、模块连接、判断分支 |
| 解释软件或通信交互 | sequenceDiagram |
时间顺序、请求与响应 |
| 展示设备或协议状态 | stateDiagram-v2 |
状态与触发条件 |
| 展示代码中的对象关系 | classDiagram |
类、属性、方法及继承 |
| 展示数据库结构 | erDiagram |
表、字段、实体关系 |
| 制定科研或开发计划 | gantt |
任务、工期、依赖 |
| 展示概念分类 | mindmap |
主题与层级 |
| 展示事件历程 | timeline |
关键事件与阶段 |
使用建议:Mermaid 的优势是快速、可维护、可复用;对于要求精确摆放、复杂跨层布线或出版级精细设计的图,Visio、draw.io 或矢量设计工具可能更合适。
2. 快速上手:第一张流程图
先阅读这一段:
1 | flowchart LR |
逐行解释:
flowchart LR:创建从左到右的流程图。A[采集数据]:定义 ID 为A、显示文字为“采集数据”的矩形节点。A --> B:建立从 A 指向 B 的箭头。C{数据是否有效?}:花括号表示判断/决策节点。-->|是|:为箭头添加“是”标签。E --> A:让流程返回前面的步骤,形成循环。
重要区别:节点 ID 不等于显示文字。 在 A[采集数据] 中,后续连线使用的是 A,而不是“采集数据”。尽量用简短、无空格的英文或数字字母组合做 ID;显示文字可以使用中文。
3. 流程图基础:方向、节点与连线
3.1 图的方向
| 声明 | 方向 |
|---|---|
flowchart TB / flowchart TD |
从上到下 |
flowchart BT |
从下到上 |
flowchart LR |
从左到右 |
flowchart RL |
从右到左 |
方向选取技巧:算法的处理步骤较多时使用 TB;模块间的信号流较长时使用 LR。
3.2 常用节点形状
1 | flowchart LR |
语法速查:
| 代码 | 形状 | 典型含义 |
|---|---|---|
A[处理] |
矩形 | 普通处理步骤 |
A(开始) |
圆角矩形 | 开始、结束 |
A{条件?} |
菱形 | 判断、分支 |
A([完成]) |
胶囊形 | 终止节点 |
A[(数据)] |
圆柱形 | 数据库、存储 |
A((节点)) |
圆形 | 状态或连接点 |
A[[子程序]] |
双边框矩形 | 子程序、预定义处理 |
3.3 常用连线
1 | flowchart LR |
| 语法 | 含义 |
|---|---|
A --> B |
实线单向箭头 |
A --- B |
实线、无箭头 |
A -.-> B |
虚线箭头 |
A ==> B |
加粗箭头 |
A <--> B |
双向箭头 |
| `A –> | 条件 |
图中连接线一般表示逻辑关系,不必然表示物理数据线;在正式科研图中,应在图注说明连线含义。
3.4 多分支与多入口
1 | flowchart TB |
3.5 显示文本包含特殊字符
当节点文字含有括号、冒号或复杂符号时,推荐将文字用双引号包起来:
1 | flowchart LR |
建议养成 A["节点文字"] 的习惯,可以减少很多语法歧义。
3.6 注释
Mermaid 使用 %% 表示注释:
1 | flowchart LR |
注释适合记录设计理由,但不会显示在图里。
4. 流程图进阶:分组、布局与配色
4.1 使用 subgraph 给模块分组
subgraph ... end 能将多个节点包进同一个区域,特别适合系统架构图。
1 | flowchart LR |
要点:
TX是子图 ID;["发送端"]是子图标题。- 子图中的连线照常写,模块之间也可以连线。
- 可以在子图内部写
direction TB调整方向,不过最终布局可能受到外部连线和布局算法的影响,不能保证像 Visio 那样精确定位。
4.2 一套简洁的工程论文风格
建议用白色或浅灰底色、深灰边框,只对关键模块使用强调色。
1 | flowchart LR |
这里:
classDef normal ...定义名为normal的样式。:::normal将样式直接应用到节点。fill是填充颜色,stroke是边框颜色,color是字体颜色。- 也可以使用
class A,B normal;为多个节点分配类。
4.3 单独调整某个节点
1 | flowchart LR |
style 适合少数节点,classDef 适合大量复用。
4.4 为单张图设置主题
一些支持 Mermaid 配置前置区的渲染器允许在图中写:
1 | --- |
常见主题包括 default、dark、forest、neutral、base。图表主题、具体默认外观和布局可能随 Mermaid 版本变化;若跨平台使用,优先选择通用样式,并在目标平台预览。
4.5 排版经验
- 每张图先明确一个核心问题,不要在同一张图里塞入所有细节。
- 主链路尽量沿一个方向展开,减少折返线和交叉线。
- 同类模块采用相同形状和样式。
- 重要连接可以添加简短的标签,如“数据”“控制”“反馈”。
- Mermaid 是自动布局,节点的确切坐标不可像 PPT 那样随意指定。
5. 时序图:表达消息交互
时序图描述谁在什么时候向谁发送了什么信息,特别适合通信协议、客户端与服务器交互、SDR 控制与反馈过程。
5.1 基本语法
1 | sequenceDiagram |
要点:
participant UE as 用户设备:定义参与者 ID 和显示名称。UE->>BS:实线消息箭头。SERVER-->>BS:虚线响应箭头。- 参与者从左到右排列,交互按从上到下的顺序发生。
5.2 常用消息符号
| 语法 | 含义 |
|---|---|
A->>B: 消息 |
实线消息箭头 |
A-->>B: 响应 |
虚线消息箭头 |
A->B: 消息 |
实线无箭头端点的连线 |
A-->>A: 自处理 |
参与者对自己的消息 |
Note right of A: 说明 |
A 右侧的注释 |
Note over A,B: 说明 |
跨越 A 和 B 的注释 |
5.3 判断、循环和自动编号
1 | sequenceDiagram |
autonumber:自动为消息编号。alt ... else ... end:互斥分支。loop ... end:循环过程。opt ... end:可选执行块。
5.4 显示执行过程
1 | sequenceDiagram |
activate / deactivate 在参与者生命线上绘制执行条,可突出处理时段。时序图展示的是交互顺序,并不自动保证时间间隔按真实比例显示。
6. 状态图:表达状态转换
状态图适合描述通信设备、协议连接、任务调度器等有限状态机。
1 | stateDiagram-v2 |
理解:
stateDiagram-v2:声明状态图。[*]:特殊的初始或终止标记;箭头方向决定角色。Idle --> Sync: ...:触发某条件后从一个状态转换到另一个状态。
包含终止状态的例子
1 | stateDiagram-v2 |
状态图强调的是“当前处于什么状态、在什么条件下转移”,不同于流程图强调“步骤怎么执行”。
7. 类图:表达软件结构
类图属于 UML 图的一种,适合描述 Python、C++、Java 等项目中对象和类的结构。
1 | classDiagram |
说明:
class Channel { ... }:定义类及其成员。+:公有;-:私有;#:受保护。- 带括号的成员通常表示方法,例如
transmit(symbols)。 Channel <|-- AWGNChannel:AWGNChannel继承Channel。
常见关系:
| 代码 | 含义 |
|---|---|
| `Parent < | – Child` |
A *-- B |
组合(强拥有关系) |
A o-- B |
聚合(弱拥有关系) |
A --> B |
关联 |
A ..> B |
依赖 |
| `A .. | > Interface` |
Mermaid 类图通常用来表达结构,不用于完整取代 UML 建模工具。
8. ER 图:表达数据库关系
ER(Entity–Relationship)图用来描述数据库中的实体、属性和实体间关系。
1 | erDiagram |
常见符号理解:
||:恰好一个。o|:零个或一个。|{:一个或多个。o{:零个或多个。PK/FK:主键 / 外键标记。
例如 USER ||--o{ EXPERIMENT 表示:一个用户可以创建零个或多个实验,每个实验对应恰好一个用户。
9. 甘特图:表达项目进度
甘特图(Gantt)常用于论文实验计划、原型系统开发计划、软件项目管理。
1 | gantt |
主要语法:
title:标题。dateFormat YYYY-MM-DD:输入日期格式。axisFormat %m/%d:坐标轴显示格式。section:任务分组。:a1, 2026-11-16, 5d:任务 ID、开始时间、持续时间。after a1:等前一个任务结束后开始。crit:标注关键任务。
注意:示例中“端到端联调”仅依赖
b1,为了表示必须等待发送端与接收端都完成,实际项目应更谨慎设置依赖。Mermaid 甘特图更适合可视化计划,并非完整的项目调度引擎。
10. 其他常用图:饼图、思维导图和时间线
10.1 饼图 pie
1 | pie showData |
pie showData 可以显示数据标签。示例数值仅用于演示,不代表实际测量结果。
10.2 思维导图 mindmap
1 | mindmap |
思维导图主要靠缩进表达父子层级。不同阅读器的 Mermaid 版本可能对思维导图的支持有所差异。
10.3 时间线 timeline
1 | timeline |
时间线适合展示事件顺序,不需要像甘特图那样精确描述任务持续时间。
11. 完整案例:无线通信系统处理链
下面以一个简化的语义通信 + OFDM 收发处理链为例。这个图综合了子图、模块连接、样式分类和反馈链路。它是结构示意,不代表所有硬件原型必须采用同样的信号处理顺序。
1 | flowchart LR |
这张图可用来练习以下操作:
- 将
flowchart LR改成flowchart TB,观察整体布局变化。 - 为发送端添加“量化”节点,并明确放置位置。
- 将接收端的“同步与 OFDM 解调”拆成两个节点。
- 去掉反馈线,形成纯单向链路。
- 为“信道估计与检测”添加可选算法分支,例如 LS、LMMSE 或神经网络。
科研使用建议:如果图要进入 IEEE 论文,建议先用 Mermaid 快速形成结构草图,再根据排版要求检查字号、线宽、可读性,必要时导出 SVG 并进行矢量编辑。
12. 在 Markdown 中显示与导出图表
本节尤其重要:Markdown 文件中写有 Mermaid 代码,并不意味着所有 Markdown 阅读器、PDF 导出工具都能自动渲染。
12.1 在线直接练习:Mermaid Live Editor
打开 Mermaid Live Editor,粘贴下面的代码:
1 | flowchart LR |
它适合实时修改语法、查看渲染效果,并导出图形。支持的格式和具体导出选项取决于在线编辑器版本。
12.2 在 GitHub 查看
GitHub 的 Markdown 渲染支持 Mermaid 代码块。把包含 ```mermaid 代码块的 .md 文件推送到仓库,在 GitHub 的文件预览中通常可以直接看到图表。
需要注意:GitHub 的渲染引擎版本由平台决定;某些新特性不一定同步支持。
12.3 在 VS Code 中查看
可选工作流程:
- 使用 VS Code 打开
.md文件。 - 根据需要安装支持 Mermaid 的 Markdown 预览扩展,例如 Markdown Preview Mermaid Support;不同 VS Code 版本与预览扩展的支持情况可能不同。
- 打开 Markdown 预览:
Ctrl + Shift + V。 - 如果图仍然显示为代码,检查预览扩展是否已启用,以及当前 Mermaid 语法是否兼容。
容易混淆的一点:语法高亮不等于图表渲染。只负责把 Mermaid 代码染色的扩展,不一定能在 Markdown 预览区生成图形。
12.4 使用 Mermaid CLI 导出 SVG / PNG / PDF
如果已安装 Node.js 和 npm,可以安装 Mermaid 官方命令行工具:
1 | npm install -g @mermaid-js/mermaid-cli |
新建文件 demo.mmd(不是 Markdown 文件,内容直接从图类型声明开始):
1 | flowchart LR |
在终端运行:
1 | # 输出矢量图,适合论文和技术文档 |
如果还不想全局安装,可以尝试:
1 | npx -p @mermaid-js/mermaid-cli mmdc -i demo.mmd -o demo.svg -b white |
注意:上面的 demo.pdf 是由单张 Mermaid 图导出的 PDF,不是整份 Markdown 学习笔记的 PDF。
12.5 将整份 Markdown 的 Mermaid 图转换成 SVG 引用
当 Markdown 本身包含多个 Mermaid 代码块时,可使用 Mermaid CLI 的 Markdown 转换功能:
1 | mmdc -i input.md -o output.md |
这会将源 Markdown 中的 Mermaid 图表转换成外部 SVG 图文件引用,并生成新的 Markdown 文件(具体生成文件名以运行结果为准)。随后:
- 保留新 Markdown 文件和它引用的 SVG 文件在合适的相对路径中。
- 用支持 SVG 图片的 Markdown 渲染工具打开新文件。
- 确保预览中每张图都能显示,再使用该工具的打印 / 导出 PDF功能。
- 检查 PDF 中的中文、字体、图片清晰度、分页和页面留白。
这种做法通常比直接把含 mermaid 代码块的 Markdown 交给一个不支持 Mermaid 的 PDF 转换器更可靠。
12.6 另一条可靠路线:图先生成,再引用
如果只需要少量图,可以独立导出:
1 | project/ |
在 notes.md 中使用普通 Markdown 图片语法:
1 |  |
这样就不依赖下游 Markdown/PDF 工具是否能识别 Mermaid 语法,但仍然需要导出器支持 SVG。若不支持 SVG,可改用 PNG。
12.7 为什么 Mermaid 在 Markdown 里正常、导出 PDF 后却消失?
通常不是 Mermaid 代码写错,而是渲染链不一致:
1 | flowchart TB |
解决思路:要么使用确实支持 Mermaid 的 PDF 导出流程,要么先将 Mermaid 渲染为 SVG/PNG,再把外部图片嵌入 Markdown。只把 .md 文件换一个扩展名,不能解决这个问题。
13. 常见错误及排查
| 现象 | 常见原因 | 建议 |
|---|---|---|
| 图不显示,只显示代码 | Markdown 阅读器不支持 Mermaid | 使用 Live Editor 或带 Mermaid 支持的预览器 |
| 提示语法解析错误 | 括号、特殊字符或关键字冲突 | 使用 A["带引号的文本"];逐行删除定位问题 |
| 某些节点没有显示 | ID 拼写错误或未连接 | 检查节点 ID、大小写和连接线 |
| 方向没有完全按预期排列 | 自动布局算法决定具体位置 | 减少交叉连接、拆分子图;必要时改用绘图软件 |
| 颜色或字体与预期不一致 | Mermaid 主题、版本或外部样式差异 | 尽量用 classDef;目标平台重新检查 |
| 中文出现乱码或方框 | 渲染环境缺少相应字体 | 调整环境字体或换用兼容字体的导出方式 |
| PDF 中没有图 | 导出工具没有执行 Mermaid 渲染 | 先导出 SVG/PNG,再引用图片 |
| SVG 在某些 PDF 工具中不显示 | 导出器 SVG 兼容问题 | 转成 PNG,或换用支持 SVG 的导出器 |
| 新图类型不能渲染 | Mermaid 版本过旧 | 检查当前渲染器版本,或先用更通用的图类型 |
容易踩的坑:
- 流程图中尽量不要直接使用全小写的
end作为节点标识或关键字形式的标签,因为它可能与subgraph ... end的结束关键字冲突。 - Mermaid 的语法大小写敏感,例如
sequenceDiagram、stateDiagram-v2、classDiagram不应随意改写。 - 不要把 Mermaid 代码块里的 Markdown 图片语法
当作 Mermaid 语法。 - 代码是否能在某个编辑器显示,最终以实际使用的 Mermaid 渲染器为准。
推荐的排错顺序
- 将单张有问题的图复制到 Mermaid Live Editor。
- 如果 Live Editor 也报错,先检查语法;把图缩减为两个节点和一条线。
- 如果 Live Editor 正常、Markdown 里异常,检查预览器及版本。
- 如果预览正常、PDF 异常,优先检查 PDF 工具是否真正渲染了 Mermaid。
14. 速查表、练习与官方资料
14.1 图表类型速查
| 图类型 | 声明语句 | 学习优先级 |
|---|---|---|
| 流程图 | flowchart LR |
★★★★★ |
| 时序图 | sequenceDiagram |
★★★★★ |
| 状态图 | stateDiagram-v2 |
★★★★☆ |
| 甘特图 | gantt |
★★★★☆ |
| 类图 | classDiagram |
★★★☆☆ |
| ER 图 | erDiagram |
★★★☆☆ |
| 饼图 | pie |
★★★☆☆ |
| 思维导图 | mindmap |
★★★☆☆ |
| 时间线 | timeline |
★★☆☆☆ |
14.2 流程图语法速查
| 需求 | 写法 |
|---|---|
| 创建左右方向流程图 | flowchart LR |
| 矩形节点 | A["文本"] |
| 判断节点 | A{"条件"} |
| 普通箭头 | A --> B |
| 虚线箭头 | A -.-> B |
| 带文字的箭头 | `A –> |
| 创建分组 | subgraph G["分组"] … end |
| 定义样式 | classDef key fill:#FFFFFF,stroke:#333333; |
| 应用样式 | class A,B key; |
| 注释 | %% 注释内容 |
14.3 三道练习题
练习 1:算法流程图
绘制“读取图片 → 预处理 → 图像编码 → 信道传输 → 图像重建 → 计算 PSNR”的流程。添加“PSNR 是否达标”的判断分支。
练习 2:通信协议时序图
绘制发送端和接收端的“同步 → 数据传输 → ACK/NACK → 可选重传”的交互过程,使用 alt 和 loop。
练习 3:论文技术路线图
用 subgraph 把研究内容划分为“理论建模、算法设计、原型验证”三个区域,并使用简洁的黑白/浅蓝配色。
14.4 建议的学习顺序
- 第 1 天:学会流程图方向、节点、箭头、分支,能绘制算法图。
- 第 2 天:学习
subgraph、classDef,能绘制结构清晰的技术路线图。 - 第 3 天:学习时序图、状态图,能描述协议和软件交互。
- 后续按需:学习类图、ER 图、甘特图与导出工具。
14.5 官方资料
以下链接可直接查看具体语法和示例:
- Mermaid 官方网站
- Mermaid Live Editor(在线练习)
- 流程图官方文档
- 时序图官方文档
- 状态图官方文档
- 类图官方文档
- ER 图官方文档
- 甘特图官方文档
- Mermaid CLI 官方仓库
总结
学 Mermaid 最重要的是掌握两条思路:
- 先用简单的节点与连接表达结构,再考虑布局和配色。 对于算法和科研技术路线,
flowchart是最值得优先熟练掌握的类型。 - 区分“Mermaid 源代码”和“渲染后的图片”。 Markdown 能否看到图、PDF 能否保留图,取决于所使用的渲染与导出工具,而不只是文件本身。
如果只记住一个最小模板,记住下面这段即可:
1 | flowchart LR |
完成本教程后,建议自己从空白文档写一张真实的系统流程图,再尝试导出 SVG 和 PDF。实际绘制比记忆全部语法更有效。
