DOT语言是一种文本图形描述语言。它提供了一种简单的描述图形的方法,并且可以为人类和计算机程序所理解。DOT语言文件通常是具有.gv或是.dot文件扩展名

很多程序都可以处理DOT文件。其中的一些,例如dotneatotwopicirco, fdpsfdp,会读取DOT文件并将之渲染成为图形格式。其它的一些,比如gvprgcaccyclicccompssccmaptred,可以读取DOT文件并对它代表的图形进行一些处理。类似于GVeditleftydottygrappa则提供了交互式的界面。以上程序大部分都包括在了Graphviz软件包中。

语法

图形类别

无向图

 
一张无向图

在最简单的应用中,DOT语言可以用来描述一张无向图。无向图显示了对象间最简单的关系,例如人之间的友谊。使用关键字graph开始一张无向图的定义,并用大括号包含要描述的节点,双连字号(--)被用来描述节点间的关系。另外,一行的末尾需要加上分号(;)。

  graph graphname {
     a -- b -- c;
     b -- d;
 }

有向图

 
一张有向图

类似于无向图,DOT语言也可以用来描述一张有向图,类似于流程图树状图。其语法与无向图相似,但要在图的最开始使用关键字'digraph',并用箭头(->)表示节点直接的关系。

 digraph graphname {
    a -> b -> c;
    b -> d;
}

属性

 
一张有属性的图

DOT语言中,可以对节点和边添加不同的属性。这些属性可以控制节点和边的显示样式,例如颜色,形状和线形。可以在语句和句尾的分号间放置一对方括号,并在其中中放置一个或多个属性-值对。多个属性可以被逗号和空格(, )分开。节点的属性被放置在只包含节点名称的表达式后。

 graph graphname {
     // label属性可以改变节点的显示名称
     a [label="Foo"];
     // 节点形状被改变了
     b [shape=box];
     // a-b边和b-c边有相同的属性
     a -- b -- c [color=blue];
     b -- d [style=dotted];
 }

注释

DOT语言支持C语言C++风格的单行与多行注释。另外,也支持Shell脚本风格的以#开头的注释。

 // 单行注释
 /* 多行

    释 */
 # 如此的行也会被忽略。

一个简单的例子

以下是一个描述了乙烷化学键结构的示例脚本。这是一个无向图,包括了上述解释的节点属性。

 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)的位置有问题。

这些问题可以用Inkscape或其它的SVG编辑器修正。在某些情况下,也可以利用pos属性定义位置来修正这样的问题。

参见

外部链接