Python-Graphviz

一、graphviz安裝及配置

  1. 安裝graphviz軟件:
    https://graphviz.gitlab.io/_pages/Download/Download_windows.html
    https://www2.graphviz.org/Packages/stable/windows/10/cmake/Release/x64/
  2. 配置環境變量:
    把bin文件夾的路徑加入到環境變量path裏
  3. 安裝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&#92; dle|<f2> right"];
    struct2 [label="<f0> one|<f1> two"];
    struct3 [label="hello&#92;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

附錄:參考資料

  1. window 安裝包
  2. graphviz官網
  3. graphviz官網文檔
  4. pipy graphviz pip install graphviz
  5. python graphviz 文檔
  6. python graphviz的使用(畫圖工具)
  7. 使用 Graphviz 繪畫 UML 圖
  8. 使用graphviz繪製流程圖
  9. 使用DOT語言和Graphviz繪圖(翻譯)
  10. 類似於這樣的基於graphviz的流程圖繪製工具,已經有開源模塊了,叫Diagrams
  11. Python利用Graphviz畫圖
  12. 受用一生的高效 PyCharm 使用技巧(三)
  13. Python 快速繪製畫出漂亮的系統架構圖
  14. Python調用graphviz繪製流程圖,Graphviz,畫
  15. Python 一鍵轉化代碼爲流程圖
  16. 用Python編程繪製流程圖,你用過嗎?
  17. 利用Graphviz畫神經網絡框架圖
  18. 使用 dot 畫圖工具
  19. 用Graphviz自動佈局各種圖
  20. Graphviz使用教程
  21. Graphviz 畫圖的一些總結

(c) 著作權歸作者所有

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章