流程圖,顧名思義,就是表示一個事件或活動的流程的圖示。
快速入門
最簡單的例子:從 A 到 B
graph TD
A --> B
效果:
graph TD
A --> B
注意起始的關鍵字“grpah”是必須的,表明這是流程圖。
後續介紹時序圖時,該關鍵字也要改為時序圖的關鍵字:sequenceDiagram。
方向
接下來我們講講基本的概念。流程圖中,可以有方向:
- TB、TD:從上到下
- BT:從下到上
- RL:從右到左
- LR:從左到右
從下到上:
graph BT
A --> B
效果:
graph BT
A --> B
從右到左:
graph RL
A --> B
效果:
graph RL
A --> B
從左到右:
graph LR
A --> B
效果:
graph LR
A --> B
最常用的佈局方向是
- 從上向下
- 從左向右
當然也允許從下向上畫、從右向左畫,但是這兩種很少見。
基本圖形
節點除了矩形,還能換成其他形狀,這裡列出部分:
graph TD
id[帶文字的矩形]
id4(帶文字的圓角矩形)
id3>帶文字的不對稱的矩形]
id1{帶文字的菱形}
id2((帶文字的圓形))
效果:
graph TD
id[帶文字的矩形]
id4(帶文字的圓角矩形)
id3>帶文字的不對稱的矩形]
id1{帶文字的菱形}
id2((帶文字的圓形))
注意,每個形狀都是有各自含義的:
- 圓角矩形:表示開始和結束
- 矩形:表示過程,也就是整個流程中的一個環節
- 菱形:表示判斷、決策
- 圓形:表示連線。為避免流程過長或有線段交叉,可將流程切開,圓形即相當於切口處的連線頭(成對出現)
graph LR
begin(開始) --> open[把冰箱門開啟] --> put[把大象放進去] --> point((連線 A ))
pointB((連線 A )) --> close[把冰箱門關上] --> close2(結束)
連線線
節點之間的連線,有如下型別:
A --> B
:A 帶箭頭指向 BA --- B
:A 不帶箭頭指向 BA -.- B
:A 用虛線指向 BA -.-> B
:A 用帶箭頭的虛線指向 BA ==> B
:A 用加粗的箭頭指向 BA -- 描述 --- B
: A 不帶箭頭指向 B 並在中間加上文字描述A -- 描述 --> B
: A 帶箭頭指向 B 並在中間加上文字描述A -. 描述 .-> B
: A 用帶箭頭的虛線指向 B 並在中間加上文字描述A == 描述 ==> B
: A 用加粗的箭頭指向 B 並在中間加上文字描述
注意,不同形狀的線其實也有各自的含義。如果想要專業一點,可以專門去查查相關文件,什麼情況用什麼線。
示例:
graph LR
A[A] --> B[B]
A1[A] --- B1[B]
A4[A] -.- B4[B]
A5[A] -.-> B5[B]
A7[A] ==> B7[B]
A2[A] -- 描述 --- B2[B]
A3[A] -- 描述 --> B3[B]
A6[A] -. 描述 .-> B6[B]
A8[A] == 描述 ==> B8[B]
效果:
graph LR
A[A] --> B[B]
A1[A] --- B1[B]
A4[A] -.- B4[B]
A5[A] -.-> B5[B]
A7[A] ==> B7[B]
A2[A] -- 描述 --- B2[B]
A3[A] -- 描述 --> B3[B]
A6[A] -. 描述 .-> B6[B]
A8[A] == 描述 ==> B8[B]
子流程圖
語法:
subgraph title
graph definition
end
示例:
graph TB
c1-->a2
subgraph one
a1-->a2
end
subgraph two
b1-->b2
end
subgraph three
c1-->c2
end
效果:
graph TB
c1-->a2
subgraph one
a1-->a2
end
subgraph two
b1-->b2
end
subgraph three
c1-->c2
end
自定義樣式
我們還可以定義邊框的樣式、顏色。
語法:
style id 具體樣式
示例:
graph LR
id1(Start)-->id2(Stop)
style id1 fill:#f9f,stroke:#333,stroke-width:4px,fill-opacity:0.5
style id2 fill:#ccf,stroke:#f66,stroke-width:2px,stroke-dasharray: 10,5
效果:
graph LR
id1(Start)-->id2(Stop)
style id1 fill:#f9f,stroke:#333,stroke-width:4px,fill-opacity:0.5
style id2 fill:#ccf,stroke:#f66,stroke-width:2px,stroke-dasharray: 10,5
實際案例
說了這麼多,來做個有實際價值的案例:繪製一個流程圖,找出 A、 B、 C 三個數中最大的一個數。
graph LR
start[開始] --> input[輸入A,B,C]
input --> conditionA{A是否大於B}
conditionA -- YES --> conditionC{A是否大於C}
conditionA -- NO --> conditionB{B是否大於C}
conditionC -- YES --> printA[輸出A]
conditionC -- NO --> printC[輸出C]
conditionB -- YES --> printB[輸出B]
conditionB -- NO --> printC[輸出C]
printA --> stop[結束]
printC --> stop
printB --> stop
效果:
graph LR
start[開始] --> input[輸入A,B,C]
input --> conditionA{A是否大於B}
conditionA -- YES --> conditionC{A是否大於C}
conditionA -- NO --> conditionB{B是否大於C}
conditionC -- YES --> printA[輸出A]
conditionC -- NO --> printC[輸出C]
conditionB -- YES --> printB[輸出B]
conditionB -- NO --> printC[輸出C]
printA --> stop[結束]
printC --> stop
printB --> stop
參考
如何在 Markdown 中畫流程圖 - 簡書
Markdown 進階技能:用程式碼畫流程圖(程式設計零基礎也適用)