目录
前言
一、只用其自有的dot脚本语言
二、以python语言中结合dot脚本语言
三、只用python语言,调用graphviz包
前言
要做关联图,graphviz也是利器之一。
有详细介绍过,在此不再赘述。
如果论展示效果,graphviz的效果更炫,可以算是networkx的升级,而neo4j是我目前认知范围内效果最好的工具,这将在此系列的第三篇进行介绍。但最终哪个最好,还是看个人喜好了。
graphviz的使用方式挺多,我见识到了三种:1、只用其自有的dot脚本语言;2、以python语言中结合dot脚本语言;3、只用python语言,调用graphviz包。后面两个各自都有官网的案例提供。
一、只用其自有的dot脚本语言
1、先到 https://graphviz.org/download/ 下载windows版本的安装包,我下载的是 “2.48.0 EXE installer for Windows 10 (64-bit)”,双击下载后的exe文件逐步安装即可。
2、配置环境变量:将安装的bin路径(我的是 D:\Program Files\Graphviz\bin)“新建”到“系统变量”Path,单击“确定”。
3、打开windows的“命令提示符”,输入: dot -version,如果显示相关信息,则安装成功。
4、新建txt文件,命名为“a.txt”,将以下样例代码黏贴到txt中:
digraph mygraph {
node [shape=box];
"//absl/random:random"
"//absl/random:random" -> "//absl/random:distributions"
"//absl/random:random" -> "//absl/random:seed_sequences"
"//absl/random:random" -> "//absl/random/internal:pool_urbg"
"//absl/random:random" -> "//absl/random/internal:nonsecure_base"
"//absl/random:distributions"
"//absl/random:distributions" -> "//absl/strings:strings"
"//absl/random:seed_sequences"
"//absl/random:seed_sequences" -> "//absl/random/internal:seed_material"
"//absl/random:seed_sequences" -> "//absl/random/internal:salted_seed_seq"
"//absl/random:seed_sequences" -> "//absl/random/internal:pool_urbg"
"//absl/random:seed_sequences" -> "//absl/random/internal:nonsecure_base"
"//absl/random/internal:nonsecure_base"
"//absl/random/internal:nonsecure_base" -> "//absl/random/internal:pool_urbg"
"//absl/random/internal:nonsecure_base" -> "//absl/random/internal:salted_seed_seq"
"//absl/random/internal:nonsecure_base" -> "//absl/random/internal:seed_material"
"//absl/random/internal:pool_urbg"
"//absl/random/internal:pool_urbg" -> "//absl/random/internal:seed_material"
"//absl/random/internal:salted_seed_seq"
"//absl/random/internal:salted_seed_seq" -> "//absl/random/internal:seed_material"
"//absl/random/internal:seed_material"
"//absl/random/internal:seed_material" -> "//absl/strings:strings"
"//absl/strings:strings"
}
5、将文本文件的格式.txt改成.dot,即将 a.txt 改成 a.dot
6、在windows的“命令提示符”中定位到a.dot所在的路径,输入:dot -Tpng a.dot -o a.png,按回车
7、在a.dot所在的路径下,会新生成a.png,即将以上样例代码变为图片了
二、以python语言中结合dot脚本语言
官网链接为 http://www.graphviz.org/gallery/ ,有渐变色的效果。
案例又是几十个,代码多、图片大,所以我把代码包拆成2个ipynb文件,请下载:
1、graphviz:graphviz的dot脚本语言+python的官网案例1.ipynb
2、graphviz:graphviz的dot脚本语言+python的官网案例2.ipynb
展示几个经典案例
# Hello World
import graphviz
script = r'''
digraph G {Hello->World}
'''
src = graphviz.Source(script)
src
节点的形状和填充色也很丰富
# Entity-Relation Data Model
import graphviz
script = r'''
graph ER {
layout=neato
node [shape=box]; course; institute; student;
node [shape=ellipse]; {node [label="name"] name0; name1; name2;}
code; grade; number;
node [shape=diamond,style=filled,color=lightgrey]; "C-I"; "S-C"; "S-I";
name0 -- course;
code -- course;
course -- "C-I" [label="n",len=1.00];
"C-I" -- institute [label="1",len=1.00];
institute -- name1;
institute -- "S-I" [label="1",len=1.00];
"S-I" -- student [label="n",len=1.00];
student -- grade;
student -- name2;
student -- number;
student -- "S-C" [label="m",len=1.00];
"S-C" -- course [label="n",len=1.00];
label = "\n\nEntity Relation Diagram\ndrawn by NEATO";
fontsize=20;
}
'''
src = graphviz.Source(script)
src
也可以做思维导图,虽然写代码比较麻烦。
渐变色的效果,有点绚丽。这边就不附带代码了,可以在ipynb文件中找到。
总之,画图能力,确实挺强。
三、只用python语言,调用graphviz包
它也有自己的官网:https://graphviz.readthedocs.io/en/stable/examples.html
这个方式的效果,没有第二种方法的颜色绚丽,花样也没有那么多,但也挺好用的。
代码graphviz:python的graphviz包下的官网案例
同样的hello world,可以和前面比较一下代码的写法区别。
import graphviz
g = graphviz.Digraph('G', filename='hello.gv')
g.edge('Hello', 'World')
g.view()# 导出pdf
g# 直接展示
再来一个可以和前面方法比较的例子
import graphviz
e = graphviz.Graph('ER', filename='er.gv', engine='neato')
e.attr('node', shape='box')
e.node('course')
e.node('institute')
e.node('student')
e.attr('node', shape='ellipse')
e.node('name0', label='name')
e.node('name1', label='name')
e.node('name2', label='name')
e.node('code')
e.node('grade')
e.node('number')
e.attr('node', shape='diamond', style='filled', color='lightgrey')
e.node('C-I')
e.node('S-C')
e.node('S-I')
e.edge('name0', 'course')
e.edge('code', 'course')
e.edge('course', 'C-I', label='n', len='1.00')
e.edge('C-I', 'institute', label='1', len='1.00')
e.edge('institute', 'name1')
e.edge('institute', 'S-I', label='1', len='1.00')
e.edge('S-I', 'student', label='n', len='1.00')
e.edge('student', 'grade')
e.edge('student', 'name2')
e.edge('student', 'number')
e.edge('student', 'S-C', label='m', len='1.00')
e.edge('S-C', 'course', label='n', len='1.00')
e.attr(label=r'\n\nEntity Relation Diagram\ndrawn by NEATO')
e.attr(fontsize='20')
e
也能实现渐变色。
import graphviz
g = graphviz.Graph('G', filename='g_c_n.gv')
g.attr(bgcolor='purple:pink', label='agraph', fontcolor='white')
with g.subgraph(name='cluster1') as c:
c.attr(fillcolor='blue:cyan', label='acluster', fontcolor='white',
style='filled', gradientangle='270')
c.attr('node', shape='box', fillcolor='red:yellow',
style='filled', gradientangle='90')
c.node('anode')
g
其他案例也有不少,在此也只放几个经典的,还是请大家下载ipynb文件后,自己运行试试,如果能找到自己想要用到的案例,那就更好了。