graphviz快速上手

         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快速上手_第1张图片

总结一下利用graphviz画图的感受,画出的图形很直观,很容易理解,就是设置属性稍微复杂一些,如果对属性非常清楚,那么就可以画出你想画的任何图形。

你可能感兴趣的:(python)