Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实现。我们可以通过python graphviz实现轻松完成各种流程图的绘制。

1 安装

该软件包在Python 2.7和3.5+下运行,请使用pip进行安装:

pip install graphviz

要渲染生成的可在Graphviz软件使用DOT源代码,您还需要安装Graphviz(下载页面),并确保包含dot可执行文件的目录在系统路径上。

2 快速入门

2.1 基本用法

该graphviz模块提供了两个类:Graph和 Digraph。它们分别以DOT语言为无向图和有向图创建图描述。它们具有相同的 API。通过实例化一个new Graph或 Digraphobject 创建一个图形:

from graphviz import Digraph

dot = Digraph(comment='The Round Table')

print(dot)

输出如下信息

// The Round Table
digraph {
}

然后我们可以添加点和边,通过node()和edge()或edges()来实现。

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')
print(dot.source)

生成的源代码如下:

// 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]
}

最后我们可以通过如下代码保存图像pdf文件,并显示。通过设置view=True将自动使用系统默认的文件类型的查看器应用程序打开生成的文件(PDF,PNG,SVG等)。

dot.render('test-output/round-table.gv', view=True)

2.2 输出图像格式

要使用与默认PDF 不同的输出文件格式,请format在创建Graph或 Digraph对象时使用参数:

from graphviz import Graph

g = Graph(format='png')

或者在基本用法的例子中在输出中添加format='jpg’便可以获得jpg图像。

dot.render('test-output/round-table.gv',format='jpg', view=True)

如果是想设置输出图像的dpi,需要在创建Graph或Digraph对象时,设置dpi参数。

from graphviz import Graph

g = Graph(format='png')
g.graph_attr['dpi'] = '300'

2.3 图像style设置

使用graph_attr,node_attr和 edge_attr参数更改默认外观的图表,点和连接线。

from graphviz import Digraph

ps = Digraph(name='pet-shop', node_attr={'shape': 'plaintext'},format='png')
ps.node('parrot')
ps.node('dead')
ps.edge('parrot', 'dead')

2.4 属性

要设置图中的所有后续图形,点或边的树形,请使用attr()方法,如下所示:

from graphviz import Digraph
from graphviz import Graph
ni = Graph('ni',format='jpg') ni.attr('node', shape='rarrow')
ni.node('1', 'Ni!')
ni.node('2', 'Ni!') ni.node('3', 'Ni!', shape='egg') ni.attr('node', shape='star')
ni.node('4', 'Ni!')
ni.node('5', 'Ni!')
ni.attr(rankdir='LR') ni.edges(['12', '23', '34', '45'])
print(ni.source)
ni.view()

2.5 子图和聚类

图和有向图对象有一个subgraph()-用于向实例添加子图的方法。
有两种方法可以使用它:使用与唯一参数(其内容作为子图添加)类型相同的现成图形对象,或者省略图形参数(返回上下文管理器,以便在with块中更优雅地定义子图内容)。
第一个用法选项,只有graph作为参数:

from graphviz import Digraph
from graphviz import Graph
p = Graph(name='parent', node_attr={'shape': 'plaintext'},format='png')
p.edge('spam', 'eggs') c = Graph(name='child', node_attr={'shape': 'box'})
c.edge('foo', 'bar') p.subgraph(c)
p.view()

第二次使用,带有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 实例

代表的实例图像如下所示

  1. 有向图
    代码
from graphviz import Digraph

g = Digraph('G', filename='hello.gv',format='png')

g.edge('Hello', 'World')

g.view()

结果如图所示:

  1. 无向图
    代码
from graphviz import Graph

g = Graph('G', filename='process.gv', engine='sfdp',format='png')

g.edge('run', 'intr')
g.edge('intr', 'runbl')
g.edge('runbl', 'run')
g.edge('run', 'kernel')
g.edge('kernel', 'zombie')
g.edge('kernel', 'sleep')
g.edge('kernel', 'runmem')
g.edge('sleep', 'swap')
g.edge('swap', 'runswap')
g.edge('runswap', 'new')
g.edge('runswap', 'runmem')
g.edge('new', 'runmem')
g.edge('sleep', 'runmem') g.view()

结果如图所示:

  1. 子图
    代码

from graphviz import Digraph g = Digraph('G', filename='cluster.gv',format='png') # NOTE: the subgraph name needs to begin with 'cluster' (all lowercase)
# so that Graphviz recognizes it as a special cluster subgraph with g.subgraph(name='cluster_0') as c:
c.attr(style='filled', color='lightgrey')
c.node_attr.update(style='filled', color='white')
c.edges([('a0', 'a1'), ('a1', 'a2'), ('a2', 'a3')])
c.attr(label='process #1') with g.subgraph(name='cluster_1') as c:
c.attr(color='blue')
c.node_attr['style'] = 'filled'
c.edges([('b0', 'b1'), ('b1', 'b2'), ('b2', 'b3')])
c.attr(label='process #2') g.edge('start', 'a0')
g.edge('start', 'b0')
g.edge('a1', 'b3')
g.edge('b2', 'a3')
g.edge('a3', 'a0')
g.edge('a3', 'end')
g.edge('b3', 'end') g.node('start', shape='Mdiamond')
g.node('end', shape='Msquare') g.view()

结果如图所示:

4 如何进一步使用python graphviz

python graphviz官方文档如下:

https://graphviz.readthedocs.io/en/stable/index.html

在实际使用时,参考官方实例就行。但是python graphviz文档介绍不全,很多graphviz软件参数使用没有说清楚。如果不会graphviz语法,无法很好地使用python graphviz。一些python graphviz特性可以参考文档,然后对照使用。

Graphviz 画图的一些总结
Graphviz入门
GraphViz DOT有向图 (一)元素说明

实际上graphviz画一些流程图即可,而且需要较大的调整参数。因此如果非紧急绘图建议使用visio。

最新文章

  1. string.join(iterable)
  2. 在 Hibernate 中出现 database product name cannot be null 时怎么解决?
  3. Knockoutjs 实践入门 (3) 绑定数组
  4. Web API 自动生成帮助文档并使用Web API Test Client 测试
  5. magnum 命令使用说明
  6. POJ 1028题目描述
  7. CSS 实现:两栏布局(一边固定,一边自适应)
  8. 在windows系统上安装caffe
  9. 【温故知新】c#事件event
  10. 李洪强漫谈iOS开发[C语言-038]-if else if语句
  11. oracle删除表语句
  12. Oracle replace函数使用
  13. An internal error occurred during: "Requesting JavaScript AST from selection". GC overhead limit exc
  14. 使用Puppeteer抓取受限网站
  15. Mybatis Mapper接口是如何找到实现类的-源码分析
  16. Python:数据可视化pyecharts的使用
  17. 洛谷P3627[APOI2009] (讨厌的)抢掠计划
  18. 【读书笔记】segment routing mpls数据平面-2
  19. UVA1609-Foul Play(构造+递归)
  20. Ext中 grid 设置行样式

热门文章

  1. 有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。
  2. 使用python获取window注册表值的方法
  3. 如何使用webgl(three.js)实现3D储能,3D储能站,3D智慧储能、储能柜的三维可视化解决方案——第十七课
  4. Codeforces Round #786 (Div. 3) 补题记录
  5. 【笔记】区间DP
  6. ElasticSearch 常见问题
  7. 2022春每日一题:Day 11
  8. Go语言核心36讲37
  9. 【云原生 · Kubernetes】部署kube-apiserver集群
  10. 使用 Rainbond 搭建本地开发环境