一、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='''<
left | right |
对于应以字面开头'',请使用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=" left| mid\ dle| right"];
struct2 [label=" one| two"];
struct3 [label="hello\nworld |{ b |{c| d|e}| f}| g | h"];
struct1:f1 -> struct2:f0;
struct1:f2 -> struct3:here;
}
(5) HTML标签
shape=plain
字体标记为粗体,斜体,下划线,下标和上标(,,,和)
label:text
|fonttable
text:textitem
|text textitem
textitem:string
|
| text
| text
| text
| text
| text
| text
| text
| text
fonttable:table
| table
| table
| table
| table
| table
table:
rows:row
|rows row
|rows
row:
cellscells:cell
|cells cell
|cells cell
cell:
label|
digraph structs {
node [shape=plaintext]
struct1 [label=<
left | mid dle | right |
struct2 [label=<
one | two |
struct3 [label=<
hello world |
b | g | h | ||
c | d | e | |||
f |
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、文档链接
错误处理
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
附录:参考资料
(c) 著作权归作者所有