python graphviz的安装和简单作图

Graphviz (Graph Visualization Software) 使用DOT语言来描述图形的节点、连线及属性等,可以大大减少手绘图形调整图形格式的时间,而将主要精力放在图形的逻辑关系上。而且可以根据需要设置生成图像的格式,如PDF、JPG等。

以电脑配置Windows10,64位,anaconda环境下安装的python 3.5版本为例,下面的安装过程供参考。

一、软件和python包下载

先到官网下载安装软件
Graphviz官网安装包(msi)地址:https://graphviz.gitlab.io/_pages/Download/Download_windows.html
然后要配置环境变量
进入电脑——属性——高级配置——环境变量界面

1、先设置用户变量

设置用户变量

2、修改系统变量

进入系统变量的Path,然后新建,路径是graphviz的安装路径再加上\bin\dot.exe


系统变量

3、python安装graphviz包

我的电脑中安装了anaconda,所以直接用
conda install graphviz
下载的包被放在了C:\ProgramData\Anaconda3\Lib,这个路径要确保存在于用户的环境变量中

二、官方文档和参考

通过以下文档的介绍,我们能基本掌握常用的属性使用方法
User Guide
Examples
API reference
graph、node和edge的属性
学习graphviz小结
edge线条控制

三、基础知识

1、一个简单案例

流程就是用Digraph建立一个有向图,然后增加node和edge
The node()-method takes a name identifier as first argument and an optional label.如果有Label,做出的图就不显示name而是显示Label
The edge()-method takes the names of start node and end node,如果有label参数,就在线上显示标签内容

example = Digraph(comment='The Round Table')
example.node('A')#如果没有label,那么就显示为A
example.node('B', 'Sir Bedevere the Wise')
example.node('L', 'Sir Lancelot the Brave')

example.edges(['AB', 'AL'])#批量画边
example.edge('B', 'L', constraint='false')#单条边,从B指向L
example.view()
简单案例

如果不加node,直接用edge,系统也会默认先建立这些node


image.png

2、更改graph、node、edge的属性

Use the graph_attr, node_attr, and edge_attr arguments to change the default appearance of your graph, nodes, and edges.
例如要建立一个Digraph,并设置两个node,一条连接线,就可以在创建Digraph时规定Digraph的画布是从左到右展开(或从上到下‘TB’),连接线的形状是直线,node的形状是文本框,edge的箭头样式是vee

ps = Digraph(name='pet-shop', graph_attr={'rankdir':'LR','splines':'ortho'},node_attr={'shape': 'box'},edge_attr={'arrowhead':'vee'})
ps.node('parrot')
ps.node('dead')
ps.edge('parrot', 'dead',label='haha')#Label的
image.png

如要更新graph、node或edge的特征,就要用

ps.edge_attr.update(arrowsize='2')
ps.node_attr.update(style='filled', color='skyblue')
修改node和edge特征

3、先把图建好,直接指定graph、node、edge的属性

To directly add attritbute statements (affecting all following graph, node, or edge items within the same (sub-)graph), use the attr()-method with the target as first argument:
官网总结的很好,如果先直接影响同一个graph或subgraph下属的node或edge性质,可以在建图后,使用attr方法
例如

ni = Digraph('ni')#新建一个名为ni的图

ni.attr('node', shape='rarrow')#with the target as first argument,这里的属性修改目标是node,改为箭头型
ni.node('1', 'Ni!')#此时新建的node均为rarrow型
ni.node('2', 'Ni!')

ni.node('3', 'Ni!', shape='egg')#在新建node时直接指定形状为蛋型

ni.attr('node', shape='star')#修改node属性,形状为星星
ni.node('4', 'Ni!')#此时新建的node均为star
ni.node('5', 'Ni!')
ni.attr(rankdir='LR')#这里没有在第一个自变量处指定目标,因此修改目标是digraph,By omitting its first argument, you can use it to set arbitrary attributes as key-value pairs targeting the current (sub-)graph

ni.edges(['12', '23', '34', '45'])
ni.view()
image.png

4、subgraph

可以为当前的graph增加subgraph,有两种方法,一种直接指定:

p = Graph(name='parent')
p.edge('spam', 'eggs')
c = Graph(name='child', node_attr={'shape': 'box'})
c.edge('foo', 'bar')
p.subgraph(c)

更为推荐第二种, with a with-block (omitting the graph argument):

p = Graph(name='parent')
p.edge('spam', 'eggs')
with p.subgraph(name='child', node_attr={'shape': 'box'}) as c:
...    c.edge('foo', 'bar')
subgraph

5、图的查看

一般是直接用digraph的name.view()方法,但在修改digraph后,必须要关闭pdf才能再次调用view()方法,否则就无法查看,如果不想关闭,就要引入一个库tempfile,并在.view()的参数中加入tempfile.mktemp('.gv')。
You can use the mktemp() function from the stdlib tempfile module to render to a different file for each invocation to avoid needing to close the viewer window each time

import tempfile
g = Digraph()
g.node('spam')
g.view(tempfile.mktemp('.gv'))  
g.view(tempfile.mktemp('.gv'))

如果在Jupyter Notebook中直接查看

from graphviz import Source
Source.from_file('ni.gv')  
直接查看结果

最后一个例子,展示一下render的用法,render可以保存输出路径并展示图,是否需要打开展示可以用view控制,为了方便,我们可以在Jupyter notebook中直接查看

ni = Digraph('ni')
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.node('6', 'Ni!')
ni.attr(rankdir='LR')

ni.edges(['12', '23', '34', '45'])
ni.render('ni.gv', view=False) 
# ni.view()
# ni.view(tempfile.mktemp('.gv'))
Source.from_file('ni.gv')  
直接展示图像
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351