多语言展示
当前在线:480今日阅读:167今日分享:16

使用Graphviz和DOT语言绘图

Graphviz 是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形。类似微软的visio,但是他和visio也有很大的不同,他是用代码绘图的,使用一种名为dot的语言绘图,对于绘制复杂的流程图,类图等非常好用。 这种设计使得用户更关注于逻辑关系,实现“所思即所得”。Graphviz 的自动布局功能,无需人为干预就可以做到“最小化连线交叉”。
工具/原料
1

Graphviz

2

编辑器

基本操作
1

使用dnf install graphviz命令安装graphviz(Fedora系统)。

3

我先以这段代码为例,先绘制一个简单的无向图。graph用于定义无向图。使用“--”表述节点之间的关系。

4

使用dot -T输出的格式 dot文本 -o *.输出格式 命令,可以生成相应格式的图片。比如要根据上面的脚本生成一个svg图片,可以执行命令:dot -Tsvg eg.dot -o eg.svg

5

而有向图则要用digraph来定义,之间的关系则要用“->”来表示,如“a -> b”表示a指向b。再创建一个文本,这是它的代码和编译后生成的图片。

6

由一个节点指向多个节点时,可以将它们用大括号包上,当子节点含有空格时可用引号将其包含。可以对脚本代码加上注释,其风格与C++的注释风格一样,可以用/* */包括注释内容,也可以用//将后面到下一行为止全当作注释。

7

设立一条边时,我们可以指定这条边从起点的哪个位置射出和从哪个位置结束。控制符有n,ne,e,se,s,sw,w,nw。由于默认布局引擎在处理时不美观,这次我在编译时加入-Kcirco参数,即使用circo布局引擎。这是它的一些布局引擎和相应的作用:dot 默认布局方式,主要用于有向图neato 基于spring-model(又称force-based)算法twopi 径向布局circo 圆环布局fdp 用于无向图

8

graphviz支持子图,可以很方便地进行归纳。使用subgraph定义子图,子图的名称必须以cluster打头,否则无法识别,为了与图区别,加入了一些属性。下图是相关代码和最终效果。

添加属性
1

接下来以这段代码为例进行分析。

2

label设置了相应图形的名称,labelloc和labeljust则设置名字位置。size设置图形大小。还可以为连线设置headlabel和taillabel。

3

最上面的node和edge中设定了默认节点形状和线条样式。后面若设定了同一类的属性,将会把先前的覆盖。节点b的label属性则用设定的名称来显示,而不是节点名字。color属性指的是图形颜色,而非字体,属性可以用颜色名称,也可 用RGB颜色值。下图来自于官方文档,展示了节点、线条、集合的各自形状、样式对应的名称。

4

节点c则是一个图片,为了仅显示相应图片,需要将节点形状属性设置为“none”,label设置为空。a -> b,b -> d连线中,dir属性设置的是指向方向。both是双向,none是无向,back是后向,forward是前向。

5

节点图形设置为polygon时,可以进行以下相关设置。sides设置边数,perihperies设置多边形的外框层数,regular=true可以让你设置规则多边形,orientation可以让你的多边形旋转一个角度。skew后面跟一个(-1.0~1.0)的小数,设置倾斜程度,distortion让图形产生透视效果。

6

color属性也可以设定多种颜色和相应比例。fontcolor设置了字的颜色;fontname设置字体名称;fontsize设置文字大小。下图是以上代码的最终生成的图片。

7

比如这张来自其官方网站的一张图,或更复杂的图,如果手工绘制显然是不可能的,只能通过graphviz提供的自动布局引擎来完成。如果仅用于展示逻辑关系,graphviz完全可以胜任,但是如果图中对象的物理位置必须是准确的,如节点A必须位于左上角,节点B必须与A相邻等特性,使用graphviz则很难做到。毕竟,它的强项是自动布局。我在这里就先抛砖引玉,粗浅地介绍其最基本和最常用的功能和相应的操作方法,希望graphivz能成为你的得力工具,同时你也能在graphviz中得到更多的乐趣。

注意事项
1

如果对图片格式没有要求,建议以svg等矢量图形格式导出,图片不会因为放大、缩小图形边缘产生锯齿或毛边。

2

不同版本操作方式可能略有差异。

推荐信息