一、graphviz安裝及配置
- 安裝graphviz軟件:
https://graphviz.gitlab.io/_pages/Download/Download_windows.html
https://www2.graphviz.org/Packages/stable/windows/10/cmake/Release/x64/ - 配置環境變量:
把bin文件夾的路徑加入到環境變量path裏 - 安裝python的graphviz模塊:
pip install graphviz
二、graphviz的使用
graphviz 有兩種圖,一種是無向圖 graph ,邊用 -- 連接;一種是有向圖 digraph ,邊用 -> 連接
官網API說明
1、初步認識
from graphviz import Digraph
# 實例化一個Digraph對象(有向圖),name:生成的圖片的圖片名,format:生成的圖片格式
dot = Digraph(name="MyPicture", comment="the test", format="png")
# 生成圖片節點,name:這個節點對象的名稱,label:節點名,color:畫節點的線的顏色
dot.node(name='a', label='Ming', color='green')
dot.node(name='b', label='Hong', color='yellow')
dot.node(name='c', label='Dong')
# 在節點之間畫線,label:線上顯示的文本,color:線的顏色
dot.edge('a', 'b', label="ab\na-b", color='red')
# 一次性畫多條線,c到b的線,a到c的線
dot.edges(['cb', 'ac'])
# 打印生成的源代碼
print(dot.source)
# 畫圖,filename:圖片的名稱,若無filename,則使用Digraph對象的name,默認會有gv後綴
# directory:圖片保存的路徑,默認是在當前路徑下保存
dot.view(filename="mypicture", directory="D:\MyTest")
# 跟view一樣的用法(render跟view選擇一個即可),一般用render生成圖片,不使用view=True,view=True用在調試的時候
dot.render(filename='MyPicture', directory="D:\MyTest",view=True)
(1) 兩種圖
from graphviz import Digraph, Graph
dot = Digraph()
dot = Graph()
(2) 格式
from graphviz import Digraph, Graph
dot = Digraph(format='png')
dot.format = 'svg'
(3) 輸出
from graphviz import Digraph, Graph
dot = Digraph(format='png')
# 畫圖,filename:圖片的名稱,若無filename,則使用Digraph對象的name,默認會有gv後綴
# directory:圖片保存的路徑,默認是在當前路徑下保存
# view(filename=None, directory=None, cleanup=False, quiet=False, quiet_view=False)
dot.view(filename="mypicture", directory="D:\MyTest")
# 跟view一樣的用法(render跟view選擇一個即可),一般用render生成圖片,不使用view=True,view=True用在調試的時候
# render(filename=None, directory=None, view=False, cleanup=False,
# format=None, renderer=None, formatter=None, quiet=False, quiet_view=False)
dot.render('test-output/holy-grenade.gv', view=True)
# pipe(format=None, renderer=None, formatter=None, quiet=False)
print(dot.pipe().decode('utf-8'))
# 保存源文件
# save(filename=None, directory=None)
dot.save()
(4) 輸入
from graphviz import Source
src = Source('digraph "the holy hand grenade" { rankdir=LR; 1 -> 2 -> 3 -> lob }')
# from_file(filename, directory=None, format=None, engine=None, encoding='utf-8')
src = Source.from_file(file_name)
(5) 屬性設置
graphviz.Digraph(name=None, comment=None, filename=None, directory=None, format=None, engine=None, encoding='utf-8',
graph_attr=None, node_attr=None, edge_attr=None,
body=None, strict=False)
graphviz.Digraph.attr(kw=None, _attributes=None, **attrs)
kw – Attributes target (None or 'graph', 'node', 'edge')
graphviz.Digraph.edge_attr , graphviz.Digraph.node_attr , graphviz.Digraph.graph_attr
from graphviz import Digraph
dot = Digraph()
dot.edge_attr
dot.node_attr
dot.graph_attr
2、特殊技能
(1)引用和類似HTML的標籤
如果字符串以開頭'<'和結尾'>',則按原樣傳遞而不用引號/轉義:尖括號之間的內容被引擎視爲特殊的HTML字符串,可用於類似HTML的標籤:
from graphviz import Graph
h = Graph('html_table')
h.node('tab', label='''<<TABLE>
<TR>
<TD>left</TD>
<TD>right</TD>
</TR>
</TABLE>>''')
對於應以字面開頭'<'和結尾的字符串'>',請使用nohtml()函數禁用斜括號的特殊含義,並應用常規的引號/轉義符
from graphviz import nohtml, Digraph
d = Digraph(format='svg')
d.node('diamond', label=nohtml('<>'))
print(d.source)
(2)子圖和類
Graph和Digraph對象有一個 subgraph()增加一個子圖實例-方法。
有兩種使用方式:要麼使用與唯一參數相同類型的現成圖形對象(其內容作爲子圖添加),要麼忽略該graph參數(返回上下文管理器以在其中更優雅地定義子圖內容)一with嵌段)。
第一個用法選項,帶有graph作爲唯一參數:
p = Graph(name='parent')
p.edge('spam', 'eggs')
c = Graph(name='child', node_attr={'shape': 'box'})
c.edge('foo', 'bar')
p.subgraph(c)
第二次使用,帶有with-block(忽略graph參數):
p = Graph(name='parent')
p.edge('spam', 'eggs')
with p.subgraph(name='child', node_attr={'shape': 'box'}) as c:
c.edge('foo', 'bar')
(3) 鏈接到cluster的圖中
compound: bool,默認值:false
如果爲true,則在羣集之間允許使用edge鏈接。
與lhead及ltail同時使用
(4) 結構體
digraph structs {
node [shape=record];
struct1 [label="<f0> left|<f1> mid\ dle|<f2> right"];
struct2 [label="<f0> one|<f1> two"];
struct3 [label="hello\nworld |{ b |{c|<here> d|e}| f}| g | h"];
struct1:f1 -> struct2:f0;
struct1:f2 -> struct3:here;
}
(5) HTML標籤
shape=plain
字體標記爲粗體,斜體,下劃線,下標和上標(<B>,<I>,<U>,<SUB>和<SUP>)
label : text
| fonttable
text : textitem
| text textitem
textitem : string
| <BR/>
| <FONT> text </FONT>
| <I> text </I>
| <B> text </B>
| <U> text </U>
| <O> text </O>
| <SUB> text </SUB>
| <SUP> text </SUP>
| <S> text </S>
fonttable : table
| <FONT> table </FONT>
| <I> table </I>
| <B> table </B>
| <U> table </U>
| <O> table </O>
table : <TABLE> rows </TABLE>
rows : row
| rows row
| rows <HR/> row
row : <TR> cells </TR>
cells : cell
| cells cell
| cells <VR/> cell
cell : <TD> label </TD>
| <TD> <IMG/> </TD>
digraph structs {
node [shape=plaintext]
struct1 [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD>left</TD><TD PORT="f1">mid dle</TD><TD PORT="f2">right</TD></TR>
</TABLE>>];
struct2 [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD PORT="f0">one</TD><TD>two</TD></TR>
</TABLE>>];
struct3 [label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR>
<TD ROWSPAN="3">hello<BR/>world</TD>
<TD COLSPAN="3">b</TD>
<TD ROWSPAN="3">g</TD>
<TD ROWSPAN="3">h</TD>
</TR>
<TR>
<TD>c</TD><TD PORT="here">d</TD><TD>e</TD>
</TR>
<TR>
<TD COLSPAN="3">f</TD>
</TR>
</TABLE>>];
struct1:f1 -> struct2:f0;
struct1:f2 -> struct3:here;
}
(6) 字體亂碼
from graphviz import Digraph
dot = Digraph(name="MyPicture", format="png")
dot.node(name="A", label="老師", fontname="Microsoft YaHei")
dot.node('B', '學生', fontname="Microsoft YaHei")
dot.edge("A", "B", label="教學", fontname="Microsoft YaHei")
dot.render(filename="MyPicture")
# 有些字體是需要下載的,默認使用Microsoft YaHei就好
00、字體樣式微軟雅黑:Microsoft YaHei
01、字體樣式華文黑體:STHeiti
02、字體樣式華文楷體:STKaiti
03、字體樣式華文宋體:STSong
04、字體樣式華文仿宋:STFangsong
05、字體樣式黑體:SimHei
06、字體樣式宋體:SimSun
07、字體樣式新宋體:NSimSun
08、字體樣式仿宋:FangSong
09、字體樣式楷體:KaiTi
10、字體樣式仿宋_GB2312:FangSong_GB2312
11、字體樣式楷體_GB2312:KaiTi_GB2312
12、字體樣式微軟正黑體:Microsoft JhengHei
13、字體樣式微軟雅黑體:Microsoft YaHei
14、字體樣式隸書:LiSu
15、字體樣式幼圓:YouYuan
16、字體樣式華文細黑:STXihei
17、字體樣式華文楷體:STKaiti
18、字體樣式華文宋體:STSong
19、字體樣式華文中宋:STZhongsong
20、字體樣式華文仿宋:STFangsong
21、字體樣式方正舒體:FZShuTi
22、字體樣式方正姚體:FZYaoti
23、字體樣式華文彩雲:STCaiyun
24、字體樣式華文琥珀:STHupo
25、字體樣式華文隸書:STLiti
26、字體樣式華文行楷:STXingkai
27、字體樣式華文新魏:STXinwei
3、文檔鏈接
The DOT Language
Command-line Usage
Output Formats
Node, Edge and Graph Attributes
Node Shapes
Arrow Shapes
Colors
錯誤處理
1. 不能識別格式
CalledProcessError: Command '['dot', '-Tsvg', '-O', 'MyPicture.gv']'
returned non-zero exit status 1.
[stderr: b'Format: "svg" not recognized. Use one of:\r\n']
直接使用如下幾步, 打開cmd(在管理員權限下)
dot -v
dot -c
dot -v
附錄:參考資料
- window 安裝包
- graphviz官網
- graphviz官網文檔
- pipy graphviz
pip install graphviz
- python graphviz 文檔
- python graphviz的使用(畫圖工具)
- 使用 Graphviz 繪畫 UML 圖
- 使用graphviz繪製流程圖
- 使用DOT語言和Graphviz繪圖(翻譯)
- 類似於這樣的基於graphviz的流程圖繪製工具,已經有開源模塊了,叫Diagrams
- Python利用Graphviz畫圖
- 受用一生的高效 PyCharm 使用技巧(三)
- Python 快速繪製畫出漂亮的系統架構圖
- Python調用graphviz繪製流程圖,Graphviz,畫
- Python 一鍵轉化代碼爲流程圖
- 用Python編程繪製流程圖,你用過嗎?
- 利用Graphviz畫神經網絡框架圖
- 使用 dot 畫圖工具
- 用Graphviz自動佈局各種圖
- Graphviz使用教程
- Graphviz 畫圖的一些總結
(c) 著作權歸作者所有