User Tools

Site Tools


dsl:dot_language

DOT 语言

Graphviz绘图工具使用Dot语言作为脚本语言。

Graphviz绘图工具

Graphviz 绘图工具是用抽象图形和网络展示结构化信息的工具。

Graphviz 有多个布局程序。他的布局程序使用文本文本描述图形,输出图像、SVG、PDF等用于网页或Postscript等。Graphviz 包括的布局有:

  • dot - 产生层级结构的有向图。这个布局在同一个方向(上下、左右)布局边,尽量避免边的交叉,并使边的长度最短;
  • neato - 弹性模型布局。这个布局算法的目标是最小化全局能量函数;
  • fdp - 与 neato 类似的弹性模型布局。这个布局算法降低力而不是能量函数;
  • sfdp - 多规模版本的 fdp 布局,适用于大规模图形;
  • twopi - 径向布局。根据与根节点的距离,节点布局在围绕根节点的圆周上;
  • circo - 环形布局。适用于多环形结构的图形。

DOT语言的语法

DOT 语言的主要语法定义。

单引号表示本意词汇,圆括号表示分组,方括号表示可选项,竖线分隔替代项。

graph : [ strict ] (graph | digraph) [ ID ] '{' stmt_list '}'
stmt_list : [ stmt [ ';' ] stmt_list ]
stmt : node_stmt
     | edge_stmt
     | attr_stmt
     | ID '=' ID
     | subgraph
attr_stmt : (graph | node | edge) attr_list
attr_list : '[' [ a_list ] ']' [ attr_list ]
a_list : ID '=' ID [ (';' | ',') ] [ a_list ]
edge_stmt : (node_id | subgraph) edgeRHS [ attr_list ]
edgeRHS : edgeop (node_id | subgraph) [ edgeRHS ]
node_stmt : node_id [ attr_list ]
node_id : ID [ port ]
port : 	':' ID [ ':' compass_pt ]
     | 	':' compass_pt
subgraph : [ subgraph [ ID ] ] '{' stmt_list '}'
compass_pt : (n | ne | e | se | s | sw | w | nw | c | _)

其中, node, edge, graph, digraph, subgraph, strict 大小写不敏感。

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 (<…>).

ID 就是一个字符串,前两项不使用引号只是为了简单。

edgeop 在有向图中使用 -> ,在无向图中使用 -- 。

Dot 语言支持 C++-风格的注释,/* */ 和 //。同时,以 # 字符开始的行被认为是C预处理器输出行,也被忽略。

分号和逗号只是为了可读性,没有强制要求。元素之间可以插入任何数量的空格。

子图和图族

子图(Subgraph)在 Graphviz主要有三个作用。一是子图代表一个图形结构,其中的节点和边要求一起处理,同时也为边的操作提供了便捷方式;

A -> {B C}

等价于

A -> B
A -> C

二是子图提供了属性设置的上下文环境;如

subgraph { 
rank = same; A; B; C; 
} 

三是子图决定了图形的布局。

词汇和语义注释

一个图必须声明为 digraphgraph。有向图必须使用 → 声明边,而无向图使用 – 声明边。

图的声明可以使用 strict,这样禁止在两个节点间创建多条边。比如

strict graph { 
  a -- b
  a -- b
  b -- a [color=blue]
} 

在节点 a,b间只会创建一个蓝色的边。

如果使用 nodeedgegraph 声明定义了缺省的属性,或使用属性赋值定义了非节点和边相关的属性,此后的图形元素会使用相同的属性,直到新的属性定义。属性定义之前为空属性。

子图会继承父图的属性定义,但有时并不希望这样,所以,与其在图形开始处列出属性定义,在子图中重置属性定义,不如在子图定义时定义属性。

字符编码

DOT 语言缺省使用 UTF-8 字符编码,也接受 Latin1 (ISO-8859-1) 字符集,需要使用 charset 属性指定。

图形的属性

所有的 图形属性都使用键值对指定,属性名和属性值是大小写敏感的。例如指定abc节点的填充颜色:

abc [fillcolor = red]

Graphviz命令行调用

所以的 Graphviz 程序都有相似的调用方法:

cmd [ flags ] [ input files ]

如果没有输入文件,程序从标准输入读取。标志如下:

  • -Gname[=value] 设置图形属性,缺省值 value = true;
  • -Nname[=value] 设置节点属性,缺省值 value = true;
  • -Ename[=value] 设置边属性,缺省值 value = true;
  • -Klayout 指定布局算法,会覆盖命令名,如运行 dot -Kneato 与运行 neato相同;
  • -Tformat[:renderer[:formatter]] 设置输出文件格式,缺省输出格式化dot文件。可以指定渲染器和格式器,可以指定多个格式;
  • -V 输出版本信息并退出;
  • -llibrary 指定设备库;
  • -n[num] 设置neato 中的 no-op 标志;
  • -ooutfile 指定输出文件,缺省输出到标准输出;
  • -O 按照输入文件名自动产生输出文件,格式由T标志指定;
  • -P Automatically generate a graph that shows the plugin configuration of the current executable. e.g. dot -P -Tps | lpr
  • -q 禁止警告信息;
  • -s[scale] 设置输入比例,缺省为 72.0,如果使用 -n标志会被忽略;
  • -v Verbose模式;
  • -x 在 neato 中,删除孤立的节点;
  • -y 缺省状态下坐标系为直角坐标系,Y轴向上,使用该标志Y轴向下;
  • -? 输出帮助信息并退出。
dsl/dot_language.txt · Last modified: 2019/05/11 01:38 by zhwiki