使用Graphviz绘图
之前在电脑上绘图一直都是用visio或是各种在线的绘图网站,我个人觉得使用visio是一件很繁琐的事情。这学期有几节课需要绘图,我就又开始了对绘图方式的寻找。前几天偶然在网上发现了使用dot语言配合Graphviz绘图的方案,这种方案十分简洁明了。今天来介绍一下用Graphviz画图的方法。
dot语言
dot语言是一门专为绘图设计的语言。
关键字
dot语言的关键字有node、edge、graph、digraph、subgraph和strict。
node:定义节点; edge:定义边;graph:定义无向图;digraph:定义有向图;subgraph:子图,继承父图属性:strict:防止相同两个节点之间重复连线
ID
ID是我们自己定义的字符串,主要用于给图和节点命名。
命名规则
Any string of alphabetic (
[a-zA-Z\200-\377]
) characters, underscores ('_'
) or digits ([0-9]
), not beginning with a digit;a numeral [
-
]?(.
[0
-9
]+ | [0
-9
]+(.
[0
-9
]*)? );any double-quoted string (“…”) possibly containing escaped quotes (")1;
an HTML string (<…>).
不由数字开头的字符串;纯数字;双引号包裹的字符串,引号需要
\
转义;尖括号包裹的HTML串。使用
我们可以通过一个例子来了解ID的使用方式:
1
2
3graph yourID{
……
}通常画简单图时图名可以省略。
结构声明
图
1
2
3
4
5
6
7
8graph {
……
}
//有向图
digraph {
……
}节点
节点可以不经过声明直接使用。
也可以提前声明从而给节点定义属性,如下例:
1
2
3
4digraph {
a, b [color=blue]
a->b;
}连线
有向图使用
->
连线,无向图使用--
连线。
安装Graphviz
Graphviz是由AT&T实验室发布的基于DOT语言脚本的自动绘图软件。它使用dot作为脚本语言,再用布局引擎解析dot脚本,并且自动布局生成设定格式图片。
第一种安装方式是在官网下载安装包,但在mac环境下,我推荐使用brew方式安装,在终端输入brew install graphviz
即可。
使用Graphviz绘制第一个图
使用sublime text或者其他编辑器创建一个.dot后缀的文件,写入以下内容:
1 | digraph { |
在命令行中执行dot -T png treeTest.dot -o treeTest.png
,就能得到一个三条边的有向图treeTest.png如下:
命令行中 -T png是指定输出格式为png,也可以指定为svg、gif、pdf等格式。
节点属性
设置节点属性
全局设置
全局属性适用于一个图中的所有节点,用以下格式来全局设置节点属性:
1
2
3
4
5graph {
node [属性1=值1,属性2=值2 ...];
......
}部分设置
当我们只想用设置图中一部分节点属性时,就应当使用局部属性设置:
1
2
3
4
5
6
7
8graph {
//只设置node1节点
node1[属性1=值1,属性2=值2...]
//同时设置node2和node3节点
node2, node3[属性1=值1,属性2=值2...]
......
}
常用属性
我们可以通过一个例子来看一下节点的一些常用属性:
1
2
3
4
5
6
7
8
9
10
11
12
13digraph node_intro {
node [fontname="Microsoft Yahei"];
shape1 [shape=box, label="蓝色边框矩形 ", color=blue, fontsize=12];
shape2 [shape=circle, label="红色填充圆形 ", style=filled, fillcolor=red];
shape3 [shape=doublecircle, label="双圈圆形", fontsize=24];
shape4 [shape=ellipse, label="红色字体椭圆 ", fontcolor=red];
shape5 [shape=polygon, sides=4, skew=0.4, label="平行四边形 "];
shape6 [shape=diamond, label="菱形 "];
shape7 [shape=record, label="{记录1|记录2|记录3}"];
shape8 [shape=none, label="无边框 "];
shape1:s -> shape2 -> shape3 -> shape4 -> shape5 -> shape6 -> shape7 -> shape8;
}绘制结果如下:
边属性
同样用一个例子来了解边的常用属性:
1 | digraph edge_intro { |
绘制结果如下:
结语
关于dot配合Graphviz绘图的内容就先介绍到这里啦。