graphviz简介
graphviz是Graphviz 图形绘图软件提供的一个简单的Python界面。
在Python的graphviz模块中,主要提供了两个类:Graph与 Digraph。Graph创建无向图,而 Digraph创建有向图。
无向图
from graphviz import Graph
# 无向图
g = Graph(comment='Undirected Graph',format='png')
g.node('A', 'I')
g.node('B', 'Apple')
g.node('C', 'Pen')
g.edges(['AB', 'AC'])
g.render('test-output/Undirected_Graph.gv', view=True)
运行程序,生成PNG格式图片:
有向图
from graphviz import Digraph
# 有向图
g = Digraph(comment='Directed graph',format='png')
g.node('A', 'Are')
g.node('B', 'You')
g.node('C', 'Ok')
g.node('D', '?')
g.edges(['AB', 'AC', 'CD', 'BD'])
g.render('test-output/directed_Graph.gv', view=True)
运行程序,生成PNG格式图片:
基本属性
from graphviz import Digraph
# 实例化一个Digraph对象(有向图);name——生成图名;comment——打印DOT source源码第一行注释;format——图片格式
dot = Digraph(name="Test01", comment="The Properties Test", format="png")
# 设置背景
dot.attr(bgcolor='white:pink', label='background', fontcolor=’black‘)
# name——节点对象的名称;label——节点名;color——节点的颜色
dot.node(name='A', label='Me', color='Red', style='filled')
dot.node(name='B', label='She', color='Blue', shape='circle')
dot.node(name='C', label='He', shape='diamond')
dot.node(name='D', label='She', color='Yellow', shape='triangle')
dot.node(name='E', label='Dog', shape='egg')
dot.node(name='F', label='Cat', shape='star')
# label——节点之间线上的文本;color——线的颜色
dot.edge('D', 'A', label="Love\nMe:)", color='Green')
# 同时连线AB与BC
dot.edges(['AB', 'BC', 'CF', 'BE'])
# 虚线
dot.edge('C', 'D', style='dotted')
# 设置箭头大小
dot.edge('D', 'E', label="Pet", arrowhead='vee', arrowsize='3', color='lightblue2')
dot.edge('A', 'F', label="Pet")
# 获取DOT source源码的字符串形式
print(dot.source)
# filename——生成图片的名称;若无filename,则使用Digraph对象的name,name后缀默认为gv;directory——图片保存的路径
dot.view(filename="Test01", directory="D:\workplace\PycharmProjects\\testGraphviz\\test-output")
# 一般用render生成图片,view=True调试
dot.render('test-output/test-table.gv', view=True)
运行程序,生成PNG格式图片:
打印出的DOT source源码为:
// The Properties Test
digraph Test01 {
bgcolor="white:pink" fontcolor=black label=background
A [label=Me color=Red style=filled]
B [label=She color=Blue shape=circle]
C [label=He shape=diamond]
D [label=She color=Yellow shape=triangle]
E [label=Dog shape=egg]
F [label=Cat shape=star]
D -> A [label="Love
Me:)" color=Green]
A -> B
B -> C
C -> F
B -> E
C -> D [style=dotted]
D -> E [label=Pet arrowhead=vee arrowsize=3 color=lightblue2]
A -> F [label=Pet]
}
BTree
from graphviz import Digraph, nohtml
g = Digraph('g', filename='btree.gv', format='png',
node_attr={'shape': 'record', 'height': '.1'})
g.node('node0', nohtml('<f0> |<f1> G|<f2>'))
g.node('node1', nohtml('<f0> |<f1> E|<f2>'))
g.node('node2', nohtml('<f0> |<f1> B|<f2>'))
g.node('node3', nohtml('<f0> |<f1> F|<f2>'))
g.node('node4', nohtml('<f0> |<f1> R|<f2>'))
g.node('node5', nohtml('<f0> |<f1> H|<f2>'))
g.node('node6', nohtml('<f0> |<f1> Y|<f2>'))
g.node('node7', nohtml('<f0> |<f1> A|<f2>'))
g.node('node8', nohtml('<f0> |<f1> C|<f2>'))
g.edge('node0:f2', 'node4:f1')
g.edge('node0:f0', 'node1:f1')
g.edge('node1:f0', 'node2:f1')
g.edge('node1:f2', 'node3:f1')
g.edge('node2:f2', 'node8:f1')
g.edge('node2:f0', 'node7:f1')
g.edge('node4:f2', 'node6:f1')
g.edge('node4:f0', 'node5:f1')
g.render('test-output/btree.gv', view=True)
运行代码,生成PNG格式图片: