DOT语言
DOT语言是一种文本图形描述语言。它提供了一种简单的描述图形的方法,并且可以为人类和计算机程序所理解。DOT语言文件通常是具有.gv或是.dot的文件扩展名。
很多程序都可以处理DOT文件。其中的一些,例如dot,neato,twopi,circo, fdp与sfdp,会读取DOT文件并将之渲染成为图形格式。其它的一些,比如gvpr,gc,accyclic,ccomps,sccmap和tred,可以读取DOT文件并对它代表的图形进行一些处理。类似于GVedit,lefty,dotty和grappa则提供了交互式的界面。以上程序大部分都包括在了Graphviz软件包中。
语法
无向图
在最简单的应用中,DOT语言可以用来描述一张无向图。无向图显示了对象间最简单的关系,例如人之间的友谊。使用关键字graph开始一张无向图的定义,并用大括号包含要描述的节点,双连字号(--)被用来描述节点间的关系。另外,一行的末尾需要加上分号(;)。
graph graphname {
a -- b -- c;
b -- d;
}
有向图
类似于无向图,DOT语言也可以用来描述一张有向图,类似于流程图和树状图。其语法与无向图相似,但要在图的最开始使用关键字'digraph',并用箭头(->)表示节点直接的关系。
digraph graphname {
外网< - 青山 - 青秀
青山 - 五象;
}
属性
DOT语言中,可以对节点和边添加不同的属性。这些属性可以控制节点和边的显示样式,例如颜色,形状和线形。可以在语句和句尾的分号间放置一对方括号,并在其中中放置一个或多个属性-值对。多个属性可以被逗号和空格(, )分开。节点的属性被放置在只包含节点名称的表达式后。
graph graphname {
// label属性可以改变节点的显示名称
a [label="Foo"];
// 节点形状被改变了
b [shape=box];
// a-b边和b-c边有相同的属性
a -- b -- c [color=blue];
b -- d [style=dotted];
}
一个简单的例子
以下是一个描述了乙烷化学键结构的示例脚本。这是一个无向图,包括了上述解释的节点属性。
graph ethane {
C_0 -- H_0 [type=s];
C_0 -- H_1 [type=s];
C_0 -- H_2 [type=s];
C_0 -- C_1 [type=s];
C_1 -- H_3 [type=s];
C_1 -- H_4 [type=s];
C_1 -- H_5 [type=s];
}
支持的程序
DOT语言定义了图,但没有提供渲染图的工具。这里列出了一些可以用来渲染,查看与修改DOT图的程序:
- Graphviz - 一组用来修改和渲染图的软件库和程序。
- OmniGraffle 可以导入DOT语言的一个子集,生成一个可编辑的文档,但转换结果不能被导出成为DOT文件。
限制
可以用DOT定义图形的位置细节,虽然不是所有实现了DOT语言的工具都可以适当的处理位置属性。因此,取决于所使用的工具,用户必须依赖于自动布局算法(可能造成非预期的输出)或者繁琐的手工布局节点属性。
例如:
digraph g {
node [shape=plaintext]
A1 -> B1
A2 -> B2
A3 -> B3
A1 -> A2 [label=f]
A2 -> A3 [label=g]
B2 -> B3 [label="g'"]
B1 -> B3 [label="(g o f)'" tailport=s headport=s]
{ rank=same; A1 A2 A3 }
{ rank=same; B1 B2 B3 }
}
上图有两个问题。右边的方形不是完美的正方形,而且标签(g o f)的位置有问题。