graphviz最初是AT&T实验室用来画流程图的工具,使用dot语言。其中根据图的类型可以分为有向图(dirgraph)和无向图(graph)。我们知道图是由点(node)和边(edge)组成的,在有向图中边使用"->"表示,无向图中边使用"--"表示,他们不可以混合使用。graphviz官方网站:http://graphviz.org/
graphviz很容易安装,在windows上可以下载msi文件,然后一路安装,在mac上可以通过brew install graphviz安装,安装完成可以使用dot -v查看是否安装成功。
$ dot -v
我们来看一个最简单的例子,编辑hello.gv文件
$ vi hello.gv
graph progress1{
a -- b
a -- b
b -- a[color=blue]
}
完成之后我们通过命令执行将它转换为图形。
$dot -Tpng hello.gv -o hello.png
生成的图形如下:
在hello.gv中我们定义了两个结点(node),a和b,他们之间有三条线,均是无向的,因此也称为无向图graph,同时第三条边我们还通过[]来设置了color属性。
我们对hello.gv稍作修改,将其改为有向图
digraph progress2{
a -> b
a -> b
b -> a[color=blue,style=filled]
}
生成图形结果如下图所示:
以上对边使用了"->",表示有向图,定义图时使用的是digraph,与无向图还是有区别的。
以上两个图形都是相对简单的,而且属性也大多使用的是默认值,现在我们稍微介绍一些基础知识,他们对我们画图会有很大的帮助。
1、我们知道图由点和线组成,点(node)是有形状(shape)的,点的形状有box,circle,polygon,plaintext,即方形、圆形、多边形、文本。默认是ellipse,即椭圆。
2、点也可以定义标签label,默认标签即点的名称(name)。
3、边线(edge)可以有方向,方向分为forward(default),back,both,none。
4、图还可以包含子图,使用subgraph定义,子图的名称必须使用cluster前缀。
5、设置属性时,可以使用node[x=y]的方式为点设置属性,也可以使用nodename[x=y]为某一个点设置属性,同理edge[x=y]可以用来为边设置属性。
下面我们利用刚才的理论基础来画一个复杂的图形,先看代码:
digraph G{
subgraph cluster1{
node[style=filled,color=white];
style=filled;
color=lightgrey;
a0 -> a1 -> a2 -> a3;
label="progress #1";
}
subgraph cluster2{
node[style=filled];
b0 -> b1 -> b2 -> b3;
label="progress #2";
color=blue;
}
start -> a0;
start -> b0;
a1 -> b3;
b2 -> a3;
a0 -> a3[dir=back];
a3 -> end;
b3 -> end;
start[shape=circle,color=red,style=filled];
end[shape=circle,color=green,style=filled];
}
上面代码定义了一个图中包含了两个字图,他们分别代表progress #1和progress #2,每个图中会有一个按顺序排列的有向图,这个图中还有结点是互相指向的,另外利用a0->a3[dir=back]实现了a3到a0的指向。利用这段代码生成的图形如下所示:
总结一下利用graphviz画图的感受,画出的图形很直观,很容易理解,就是设置属性稍微复杂一些,如果对属性非常清楚,那么就可以画出你想画的任何图形。