dot语言介绍
1.介绍
Graphviz 的好处在于,你只需要关心数据结构的流程,或者连接的方式,而不需要考虑布局。这是经典的*nix的程序的工作方式,比如latex, mate等等,都是采用这种方式来工作的。既可以达到WYTIWYG(What you think is what you get),而不是微软所提倡的WYSIWYG(What you see is what you get)。而dot则是graphviz中的默认布局方式。
dot是一门非常有意思的语言,它能够方便的通过文字描述绘制图片。
每种工具都有自己的适用场景的,那么dot语言的适用场景是什么呢?我认为是不复杂的流程图和架构图设计
为什么这么说?在画架构图的时候,我们希望在设计架构的过程中,不需要时刻考虑排版问题,而是考虑到架构的本质。
当设计完成之后,我们希望能够根据我们的思路自动生成一副图出来。这样让我们专心做事。
例子
那么dot是不是真的那么神奇,能将我们所想的画出来?我们先看看dot的语法
digraph G {
main -> parse -> execute;
main -> init;
main -> cleanup;
execute -> make_string;
execute -> printf;
init -> make_string;
main -> printf;
execute -> compare;
}
保存为g1.dot
生成图片:dot -Tpng g1.dot >g1.png
-T 输出图片格式,这里选用png。
生成图片如右图。
2.绘图相关属性:
2.1 node节点描述
node(节点)一般默认为ellipse形状, 宽度.75, 高度.5 ,虽然上述节点形状很多,估计看着也眼花,当时常用就以下4个:
box
circle
record
plaintext
faq:
如何添加node 形状信息
node1[shape=box]; 设置节点的形状为box。
node1[label=”点1”];设置节点的名字为“点1”
node的显示名字:
node节点可以用label来声明node节点的名字。
fifod1[label=“fifod”];
2.2 dir关系
dir关系是dot语言中比较重要的一环
比如T->H;
“forward” :
“back” :
”both“:
“none”:
在dot中定义dir属性:
T->H[dir=back];
2.3连接点的方向
我们可以用“n”,”ne”,”e”,””se”, “sw”,”w”,”nw”,
分别表示冲哪一个方向连接这个节点(图形)-“north, northeast……”
如下的dot代码:
digraph G{
//b->c[tailport = se];
b->c:se;
}
|
箭头指向c的东南方向
如图为:
其他方向如有兴趣可以把剩下的7个不同方向都试试。
2.4 label 属性
label 可以用来指示连接线的属性,也可以用来指定node的名字;
3 子图,点线的位置:
默认时图中的线都是从上到下的,我们可以将其改为从左到右,在文件的最上层打入rankdir=LR就是从左到右,默认是TB(top -> bottom),也可以是RL,BT。
当图中时间表之类的东西时,我们会需要点能排在一行(列),这时要用到rank,用花括号把rank=same,然后把需要并排的点一次输入。
digraph cs_version {
rankdir=LR;
{
node[shape = plaintext];
2000
->
2001
->
2002
->
2003
;
}
{
node[shape = box, style = filled];
1.0
->
1.3
->
1.5
->
1.6
;
1.0
->
1.1
}
{rank=same;
2000
;
1.0
}
{rank=same;
2001
;
1.1
;
1.3
}
{rank=same;
2002
;
1.5
}
{rank=same;
2003
;
1.6
}
|
}
子图:
画一个子图就是subgraph cluster#,必须有cluster前缀。
digraph G {
subgraph cluster0 {
node [style=filled,color=white];
style=filled;
color=lightgrey;
a0 -> a1 -> a2 -> a3;
label =
"process #1"
;
}
subgraph cluster1 {
node [style=filled];
b0 -> b1 -> b2 -> b3;
label =
"process #2"
;
color=blue
}
start -> a0;
start -> b0;
a1 -> b3;
b2 -> a3;
a3 -> a0;
a3 -> end;
b3 -> end;
start [shape=Mdiamond];
end [shape=Msquare];
}
|
当你想把一条边连到一个子图的边界上,先输入compound = true,然后就能用lhead和ltail来设置连接的子图了。
附录:内容引用来源:
http://www.graphviz.org/pdf/dotguide.pdf
http://www.graphviz.org/doc/info/shapes.html