This shows you the differences between two versions of the page.
dsl:dot_language [2019/05/10 05:53] zhwiki created |
dsl:dot_language [2019/05/11 01:38] (current) zhwiki |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== DOT 语言 ====== | ====== DOT 语言 ====== | ||
+ | Graphviz绘图工具使用Dot语言作为脚本语言。 | ||
- | DOT 语言的主要语法定义。 | + | ===== Graphviz绘图工具 ===== |
- | [[https://graphviz.gitlab.io/_pages/doc/info/lang.html]] | + | [[http://graphviz.org | Graphviz]] 绘图工具是用抽象图形和网络展示结构化信息的工具。 |
- | Terminals are shown in bold font and nonterminals in italics.单引号表示本意词汇,圆括号表示分组,方括号表示可选项,竖线分隔替代项。 | + | |
- | %% | + | Graphviz 有多个布局程序。他的布局程序使用文本文本描述图形,输出图像、SVG、PDF等用于网页或Postscript等。Graphviz 包括的布局有: |
+ | |||
+ | * dot - 产生层级结构的有向图。这个布局在同一个方向(上下、左右)布局边,尽量避免边的交叉,并使边的长度最短; | ||
+ | * neato - 弹性模型布局。这个布局算法的目标是最小化全局能量函数; | ||
+ | * fdp - 与 neato 类似的弹性模型布局。这个布局算法降低力而不是能量函数; | ||
+ | * sfdp - 多规模版本的 fdp 布局,适用于大规模图形; | ||
+ | * twopi - 径向布局。根据与根节点的距离,节点布局在围绕根节点的圆周上; | ||
+ | * circo - 环形布局。适用于多环形结构的图形。 | ||
+ | |||
+ | ===== DOT语言的语法 ===== | ||
+ | |||
+ | [[https://graphviz.gitlab.io/_pages/doc/info/lang.html | DOT 语言]]的主要语法定义。 | ||
+ | |||
+ | 单引号表示本意词汇,圆括号表示分组,方括号表示可选项,竖线分隔替代项。 | ||
+ | |||
+ | <code> | ||
graph : [ strict ] (graph | digraph) [ ID ] '{' stmt_list '}' | graph : [ strict ] (graph | digraph) [ ID ] '{' stmt_list '}' | ||
- | stmt_list : [ stmt [ ';' ] stmt_list ] | + | stmt_list : [ stmt [ ';' ] stmt_list ] |
stmt : node_stmt | stmt : node_stmt | ||
| edge_stmt | | edge_stmt | ||
Line 15: | Line 30: | ||
| ID '=' ID | | ID '=' ID | ||
| subgraph | | subgraph | ||
- | attr_stmt : (graph | node | edge) attr_list | + | attr_stmt : (graph | node | edge) attr_list |
- | attr_list : '[' [ a_list ] ']' [ attr_list ] | + | attr_list : '[' [ a_list ] ']' [ attr_list ] |
- | a_list : ID '=' ID [ (';' | ',') ] [ a_list ] | + | a_list : ID '=' ID [ (';' | ',') ] [ a_list ] |
- | edge_stmt : (node_id | subgraph) edgeRHS [ attr_list ] | + | edge_stmt : (node_id | subgraph) edgeRHS [ attr_list ] |
- | edgeRHS : edgeop (node_id | subgraph) [ edgeRHS ] | + | edgeRHS : edgeop (node_id | subgraph) [ edgeRHS ] |
- | node_stmt : node_id [ attr_list ] | + | node_stmt : node_id [ attr_list ] |
- | node_id : ID [ port ] | + | node_id : ID [ port ] |
- | port : ':' ID [ ':' compass_pt ] | + | port : ':' ID [ ':' compass_pt ] |
- | | ':' compass_pt | + | | ':' compass_pt |
- | subgraph : [ subgraph [ ID ] ] '{' stmt_list '}' | + | subgraph : [ subgraph [ ID ] ] '{' stmt_list '}' |
- | compass_pt : (n | ne | e | se | s | sw | w | nw | c | _) | + | compass_pt : (n | ne | e | se | s | sw | w | nw | c | _) |
- | %% | + | </code> |
其中, node, edge, graph, digraph, subgraph, strict 大小写不敏感。 | 其中, node, edge, graph, digraph, subgraph, strict 大小写不敏感。 | ||
Line 39: | Line 54: | ||
ID 就是一个字符串,前两项不使用引号只是为了简单。 | ID 就是一个字符串,前两项不使用引号只是为了简单。 | ||
- | edgeop 在有向图中使用 -> ,在无向图中使用 -- 。 | + | edgeop 在有向图中使用 %%->%% ,在无向图中使用 %%--%% 。 |
- | Dot 语言支持 C++-风格的注释,/* */ 和 //。同时,以 # 字符开始的行被认为是C预处理器输出行,也被忽略。 | + | Dot 语言支持 C++-风格的注释,%%/* */%% 和 %%//%%。同时,以 # 字符开始的行被认为是C预处理器输出行,也被忽略。 |
分号和逗号只是为了可读性,没有强制要求。元素之间可以插入任何数量的空格。 | 分号和逗号只是为了可读性,没有强制要求。元素之间可以插入任何数量的空格。 | ||
- | ===== 子图和图族 ===== | + | ==== 子图和图族 ==== |
子图(Subgraph)在 Graphviz主要有三个作用。一是子图代表一个图形结构,其中的节点和边要求一起处理,同时也为边的操作提供了便捷方式; | 子图(Subgraph)在 Graphviz主要有三个作用。一是子图代表一个图形结构,其中的节点和边要求一起处理,同时也为边的操作提供了便捷方式; | ||
- | %% | + | A -> {B C} |
- | A -> {B C} | + | |
- | %% | + | |
等价于 | 等价于 | ||
- | %% | + | A -> B |
- | A -> B | + | A -> C |
- | A -> C | + | |
- | %% | + | |
二是子图提供了属性设置的上下文环境;如 | 二是子图提供了属性设置的上下文环境;如 | ||
- | %% | + | subgraph { |
- | subgraph { | + | rank = same; A; B; C; |
- | rank = same; A; B; C; | + | } |
- | } | + | |
- | %% | + | |
三是子图决定了图形的布局。 | 三是子图决定了图形的布局。 | ||
- | ===== 词汇和语义注释 ===== | + | ==== 词汇和语义注释 ==== |
一个图必须声明为 **digraph** 或 **graph**。有向图必须使用 -> 声明边,而无向图使用 -- 声明边。 | 一个图必须声明为 **digraph** 或 **graph**。有向图必须使用 -> 声明边,而无向图使用 -- 声明边。 | ||
Line 76: | Line 85: | ||
图的声明可以使用 **strict**,这样禁止在两个节点间创建多条边。比如 | 图的声明可以使用 **strict**,这样禁止在两个节点间创建多条边。比如 | ||
- | %% | + | <code> |
strict graph { | strict graph { | ||
a -- b | a -- b | ||
Line 82: | Line 91: | ||
b -- a [color=blue] | b -- a [color=blue] | ||
} | } | ||
- | %% | + | </code> |
在节点 a,b间只会创建一个蓝色的边。 | 在节点 a,b间只会创建一个蓝色的边。 | ||
Line 90: | Line 99: | ||
子图会继承父图的属性定义,但有时并不希望这样,所以,与其在图形开始处列出属性定义,在子图中重置属性定义,不如在子图定义时定义属性。 | 子图会继承父图的属性定义,但有时并不希望这样,所以,与其在图形开始处列出属性定义,在子图中重置属性定义,不如在子图定义时定义属性。 | ||
- | ===== 字符编码 ===== | + | ==== 字符编码 ==== |
DOT 语言缺省使用 UTF-8 字符编码,也接受 Latin1 (ISO-8859-1) 字符集,需要使用 ''charset'' 属性指定。 | DOT 语言缺省使用 UTF-8 字符编码,也接受 Latin1 (ISO-8859-1) 字符集,需要使用 ''charset'' 属性指定。 | ||
+ | |||
+ | ==== 图形的属性 ==== | ||
+ | |||
+ | 所有的[[https://graphviz.gitlab.io/_pages/doc/info/attrs.html | 图形属性]]都使用键值对指定,属性名和属性值是大小写敏感的。例如指定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轴向下; | ||
+ | * -? 输出帮助信息并退出。 | ||
+ |