Markdown画图

本文最后更新于:December 3, 2021 pm

Mermaid 是一个用于画流程图、状态图、时序图、甘特图的库,使用 JS 进行本地渲染,广泛集成于许多 Markdown 编辑器中,是一种基于 Javascript 的图表和图表工具。使用集成了Mermaid渲染功能的Markdown编辑器,如Typora。使用时,只需将代码块的语言选择为Mermaid即可。

目录

mermaid官方文档
Mermaid能绘制的图:

  • 饼状图:使用pie关键字。
  • 流程图:使用graph关键字。
  • 序列图:使用sequenceDiagram关键字。
  • 甘特图:使用gantt关键字。
  • 类图:使用classDiagram关键字。
  • 状态图:使用stateDiagram关键字。
  • 用户旅程图:使用journey关键字。

1.流程图

用法:

1
2
graph 布局方向
其他语句....

布局方向:

用词 含义
TB 从上到下
BT 从下到上
RL 从右到左
LR 从左到右

示例:

1
2
3
4
graph TB; 
A-->B
B-->C
C-->A
graph TB;
  A-->B
  B-->C
  C-->A
1
2
3
4
graph LR;
A-->B
B-->C
C-->A
graph LR;
  A-->B
  B-->C
  C-->A

1.1 节点定义和形状

即流程图中每个文本块,包括开始、结束、处理、判断等。Mermaid 中每个节点都有一个 id,以及节点的文字。需要注意的是,如果节点的文字中包含标点符号,需要时用双引号包裹起来。

表述 说明 含义
id[文字] 矩形节点 表示过程,也就是整个流程中的一个环节
id(文字) 圆角矩形节点 表示开始和结束
id((文字)) 圆形节点 表示连接。为避免流程过长或有交叉,可将流程切开。成对
id{文字} 菱形节点 表示判断、决策
id>文字] 右向旗帜状节点

示例:

1
2
3
4
5
6
7
graph TB
A
B(圆角矩形节点)
C[矩形节点]
D((圆形节点))
E{菱形节点}
F>右向旗帜状节点]
graph TB
  A
  B(圆角矩形节点)
  C[矩形节点]
  D((圆形节点))
  E{菱形节点}
  F>右向旗帜状节点]
  
graph TB
  A([the text])
  B[[the text]]
  C[(the text)]
  D{{the text}}
  E[/the text/]
  F[\the text\]
  G[/the text\]
  H[\the text/]

1.2 连线形式

表述 说明
> 添加尾部箭头
- 不添加尾部箭头
-- 单线
--text-- 单线上加文字
== 粗线
==text== 粗线加文字
-.- 虚线
-.text.- 虚线加文字

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
graph TB
A1-->B1
A2---B2
A3--text---B3
A4--text-->B4
A5-.-B5
A6-.->B6
A7-.text.-B7
A8-.text.->B8
A9===B9
A10==>B10
A11==text===B11
A12==text==>B12
graph TB
  A1-->B1
  A2---B2
  A3--text---B3
  A4--text-->B4
  A5-.-B5
  A6-.->B6
  A7-.text.-B7
  A8-.text.->B8
  A9===B9
  A10==>B10
  A11==text===B11
  A12==text==>B12

1.2.1 连接形式

1
2
graph TB
a --> b & c--> d # a指向b、c,b、c都指向d
graph TB
   a --> b & c--> d
1
2
graph TB
a & b --> c & d
graph TB
   a & b --> c & d

1.3 子图表

用法:

1
2
3
subgraph 子图表名称
子图表中的描述语句...
end

示例:

1
2
3
4
5
6
7
graph TB
subgraph 买炸鸡前
begin(出门)--> buy[出门买炸鸡]
end
buy --> IsRemaining{"还有没有炸鸡?"}
IsRemaining --没有--> sad["伤心"]--> goBack(回家)
IsRemaining -->|有|happy[买完炸鸡开心]--> goBack
graph TB
	  subgraph 买炸鸡前
   			 begin(出门)--> buy[出门买炸鸡]
    end
    buy --> IsRemaining{"还有没有炸鸡?"}
    IsRemaining --没有--> sad["伤心"]--> goBack(回家)
    IsRemaining -->|有|happy[买完炸鸡开心]--> goBack

2.时序图

用法:

1
2
3
sequenceDiagram
[参与者1][消息线][参与者2]:消息体
...

消息线:

类型 描述
-> 无箭头的实线
–> 无箭头的虚线
->> 有箭头的实线(主动发出消息)
–->> 有箭头的虚线(响应)
-x 末端为叉的实线(表示异步)
–x 末端为叉的虚线(表示异步)

从消息接收方的时间线上标记一小段时间,表示对消息进行处理的时间间隔。

在消息线末尾增加 + ,则消息接收者进入当前消息的“处理中”状态;
在消息线末尾增加 - ,则消息接收者离开当前消息的“处理中”状态。

示例:

1
2
3
4
5
6
7
sequenceDiagram
participant 99 as 救救 # 另命名为
participant seller as 炸鸡店小哥
99 ->> seller: 还有炸鸡吗?
seller -->> 99: 没有,要现炸。
99 -x +seller:给我炸!
seller -->> -99: 您的炸鸡好了!
sequenceDiagram
    participant 99 as 救救
    participant seller as 炸鸡店小哥
    99 ->> seller: 还有炸鸡吗?
    seller -->> 99: 没有,要现炸。
    99 -x +seller:给我炸!
    seller -->> -99: 您的炸鸡好了!
    

或者使用以下语法直接说明某个参与者进入“处理中”状态。用法:

1
activate 参与者

2.1 标注

用法:

1
Note 位置表述 参与者: 标注文字

其中位置表述可以为

表述 含义
right of 右侧
left of 左侧
over 在当中,可以横跨多个参与者

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
sequenceDiagram
participant 99 as 救救
participant seller as 炸鸡店小哥
Note over 99,seller : 热爱炸鸡
Note left of 99 : 女
Note right of seller : 男
99 ->> seller: 还有炸鸡吗?
seller -->> 99: 没有,要现炸。
99 -x +seller : 给我炸!
seller -->> -99: 您的炸鸡好了!



sequenceDiagram
    participant 99 as 救救
    participant seller as 炸鸡店小哥
    Note over 99,seller : 热爱炸鸡
    Note left of 99 : 女
    Note right of seller : 男
    99 ->> seller: 还有炸鸡吗?
    seller -->> 99: 没有,要现炸。
    99 -x +seller : 给我炸!
    seller -->> -99: 您的炸鸡好了!


2.2循环

用法:

1
2
3
loop 循环条件
循环体描述语句
end

相当于编程语言中的 while 语句。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
sequenceDiagram
participant 99 as 救救
participant seller as 炸鸡店小哥

99 ->> seller: 还有炸鸡吗?
seller -->> 99: 没有,要现炸。
99 ->> +seller:给我炸!
loop 三分钟一次
99 ->> seller : 我的炸鸡好了吗?
seller -->> 99 : 正在炸
end
seller -->> -99: 您的炸鸡好了!
sequenceDiagram
    participant 99 as 救救
    participant seller as 炸鸡店小哥
   
    99 ->> seller: 还有炸鸡吗?
    seller -->> 99: 没有,要现炸。
    99 ->> +seller:给我炸!
    loop 三分钟一次
        99 ->> seller : 我的炸鸡好了吗?
        seller -->> 99 : 正在炸
    end
    seller -->> -99: 您的炸鸡好了!

2.3 选择

在多个条件中作出判断,每个条件将对应不同的消息序列。相当于 if 及 else if 语句。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sequenceDiagram    
participant 99 as 救救
participant seller as 炸鸡店小哥
99 ->> seller : 现在就多少只炸好的炸鸡?
seller -->> 99 : 可卖的炸鸡数

alt 可卖的炸鸡数 > 3
99 ->> seller : 买三只!
else 1 < 可卖的炸鸡数 < 3
99 ->> seller : 有多少买多少
else 可卖的炸鸡数 < 1
99 ->> seller : 那我明天再来
end

seller -->> 99 : 欢迎下次光临
sequenceDiagram    
    participant 99 as 救救
    participant seller as 炸鸡店小哥
    99 ->> seller : 现在就多少只炸好的炸鸡?
    seller -->> 99 : 可卖的炸鸡数
    
    alt 可卖的炸鸡数 > 3
        99 ->> seller : 买三只!
    else 1 < 可卖的炸鸡数 < 3
        99 ->> seller : 有多少买多少
    else 可卖的炸鸡数 < 1
        99 ->> seller : 那我明天再来
    end

    seller -->> 99 : 欢迎下次光临

2.4 可选

在某条件满足时执行消息序列,否则不执行。相当于单个分支的 if 语句。

示例:

1
2
3
4
5
6
7
sequenceDiagram
participant 99 as 救救
participant seller as 炸鸡店小哥
99 ->> seller : 买炸鸡
opt 全都卖完了
seller -->> 99 : 下次再来
end
sequenceDiagram
    participant 99 as 救救
    participant seller as 炸鸡店小哥
    99 ->> seller : 买炸鸡
    opt 全都卖完了
        seller -->> 99 : 下次再来
    end

2.5 并行

将消息序列分成多个片段,这些片段并行执行。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
sequenceDiagram
participant 99 as 救救
participant seller as 炸鸡店小哥

99 ->> seller : 一个炸鸡,一杯可乐!

par 并行执行
seller ->> seller : 装可乐
and
seller ->> seller : 炸炸鸡
end

seller -->> 99 : 您的炸鸡好了!
sequenceDiagram
   participant 99 as 救救
   participant seller as 炸鸡店小哥
   
    99 ->> seller : 一个炸鸡,一杯可乐!

    par 并行执行
        seller ->> seller : 装可乐
    and
        seller ->> seller : 炸炸鸡
    end

    seller -->> 99 : 您的炸鸡好了!

3.饼图

4.甘特图