文章目錄
- 前言
- Graphviz庫
- 開始
- Digraph(一)
- Dot代碼
- Digraph(二)
- Dot代碼
- Digraph(三)
- Dot代碼
- Source
- Dot代碼
- 結(jié)語
前言
之前我的博客介紹了Graphviz 畫圖教程,雖然dot語法類似C語言容易編寫和理解,但是這僅限于小圖,當(dāng)你想要畫一個大圖的時候,每一個結(jié)點都得一個個去定義名字、屬性、連接線,這無疑是十分麻煩的,這種時候就想到了Python,能否利用Python語言編寫一個畫圖腳本呢?
Graphviz庫
幸運的是,Python正好有一個Graphviz庫,Github地址
安裝也是十分簡單,只需要一行代碼:
pip install graphviz
開始
Digraph(一)
本次博客的代碼直接在Jupyter上運行,方便顯示結(jié)果
from
graphviz
import
Digraph
dot
=
Digraph
(
comment
=
'The Round Table'
)
dot
.
node
(
'A'
,
'King Arthur'
)
dot
.
node
(
'B'
,
'Sir Bedevere the Wise'
)
dot
.
node
(
'L'
,
'Sir Lancelot the Brave'
)
dot
.
edges
(
[
'AB'
,
'AL'
]
)
dot
.
edge
(
'B'
,
'L'
,
constraint
=
'false'
)
dot
Dot代碼
// The Round Table
digraph
{
A
[
label
=
"King Arthur"
]
B
[
label
=
"Sir Bedevere the Wise"
]
L
[
label
=
"Sir Lancelot the Brave"
]
A
->
B
A
->
L
B
->
L
[
constraint
=
false
]
}
Digraph(二)
from
graphviz
import
Digraph
f
=
Digraph
(
'finite_state_machine'
,
filename
=
'fsm.gv'
)
f
.
attr
(
rankdir
=
'LR'
,
size
=
'8,5'
)
f
.
attr
(
'node'
,
shape
=
'doublecircle'
)
f
.
node
(
'LR_0'
)
f
.
node
(
'LR_3'
)
f
.
node
(
'LR_4'
)
f
.
node
(
'LR_8'
)
f
.
attr
(
'node'
,
shape
=
'circle'
)
f
.
edge
(
'LR_0'
,
'LR_2'
,
label
=
'SS(B)'
)
f
.
edge
(
'LR_0'
,
'LR_1'
,
label
=
'SS(S)'
)
f
.
edge
(
'LR_1'
,
'LR_3'
,
label
=
'S($end)'
)
f
.
edge
(
'LR_2'
,
'LR_6'
,
label
=
'SS(b)'
)
f
.
edge
(
'LR_2'
,
'LR_5'
,
label
=
'SS(a)'
)
f
.
edge
(
'LR_2'
,
'LR_4'
,
label
=
'S(A)'
)
f
.
edge
(
'LR_5'
,
'LR_7'
,
label
=
'S(b)'
)
f
.
edge
(
'LR_5'
,
'LR_5'
,
label
=
'S(a)'
)
f
.
edge
(
'LR_6'
,
'LR_6'
,
label
=
'S(b)'
)
f
.
edge
(
'LR_6'
,
'LR_5'
,
label
=
'S(a)'
)
f
.
edge
(
'LR_7'
,
'LR_8'
,
label
=
'S(b)'
)
f
.
edge
(
'LR_7'
,
'LR_5'
,
label
=
'S(a)'
)
f
.
edge
(
'LR_8'
,
'LR_6'
,
label
=
'S(b)'
)
f
.
edge
(
'LR_8'
,
'LR_5'
,
label
=
'S(a)'
)
f
Dot代碼
digraph finite_state_machine
{
rankdir
=
LR size
=
"8,5"
node
[
shape
=
doublecircle
]
LR_0
LR_3
LR_4
LR_8
node
[
shape
=
circle
]
LR_0
->
LR_2
[
label
=
"SS(B)"
]
LR_0
->
LR_1
[
label
=
"SS(S)"
]
LR_1
->
LR_3
[
label
=
"S($end)"
]
LR_2
->
LR_6
[
label
=
"SS(b)"
]
LR_2
->
LR_5
[
label
=
"SS(a)"
]
LR_2
->
LR_4
[
label
=
"S(A)"
]
LR_5
->
LR_7
[
label
=
"S(b)"
]
LR_5
->
LR_5
[
label
=
"S(a)"
]
LR_6
->
LR_6
[
label
=
"S(b)"
]
LR_6
->
LR_5
[
label
=
"S(a)"
]
LR_7
->
LR_8
[
label
=
"S(b)"
]
LR_7
->
LR_5
[
label
=
"S(a)"
]
LR_8
->
LR_6
[
label
=
"S(b)"
]
LR_8
->
LR_5
[
label
=
"S(a)"
]
}
Digraph(三)
from
graphviz
import
Digraph
g
=
Digraph
(
'G'
,
filename
=
'cluster_edge.gv'
)
g
.
attr
(
compound
=
'true'
)
with
g
.
subgraph
(
name
=
'cluster0'
)
as
c
:
c
.
edges
(
[
'ab'
,
'ac'
,
'bd'
,
'cd'
]
)
with
g
.
subgraph
(
name
=
'cluster1'
)
as
c
:
c
.
edges
(
[
'eg'
,
'ef'
]
)
g
.
edge
(
'b'
,
'f'
,
lhead
=
'cluster1'
)
g
.
edge
(
'd'
,
'e'
)
g
.
edge
(
'c'
,
'g'
,
ltail
=
'cluster0'
,
lhead
=
'cluster1'
)
g
.
edge
(
'c'
,
'e'
,
ltail
=
'cluster0'
)
g
.
edge
(
'd'
,
'h'
)
g
Dot代碼
digraph G
{
compound
=
true
subgraph cluster0
{
a
->
b
a
->
c
b
->
d
c
->
d
}
subgraph cluster1
{
e
->
g
e
->
f
}
b
->
f
[
lhead
=
cluster1
]
d
->
e
c
->
g
[
lhead
=
cluster1 ltail
=
cluster0
]
c
->
e
[
ltail
=
cluster0
]
d
->
h
}
Source
from
graphviz
import
Source
src
=
Source
(
'digraph "the holy hand grenade" { rankdir=LR; 1 -> 2 -> 3 -> lob }'
)
src
Dot代碼
digraph
"the holy hand grenade"
{
rankdir
=
LR
;
1
->
2
->
3
->
lob
}
結(jié)語
粗略地記錄了下Graphviz庫的一些語法及操作,更多內(nèi)容可以看Graphviz文檔
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
