02.dot语法

DOT是Graphviz定义图形的领域特定语言,通过编写DOT脚本,完成各种结构图形的定义,布局引擎解析DOT脚本并完成布局和渲染,输出成各种格式以满足需求。

Graphviz的文件后缀名为.gv,每个.gv文件代表一个图形。可以使用各种布局引擎来解析生成不同样式的图形。DOT语法非常简单。

抽象语法

DOT语言的官方抽象语法说明参见: https://graphviz.gitlab.io/_pages/doc/info/lang.html

以下是一些总结:

注释

DOT支持 C++ 样式的注释:/* *///

声明graph

格式如下:

[ strict ] (graph | digraph) [ ID ] '{' stmt_list '}'

使用digraph 图形名可以声明一个有向图,使用graph 图形名可以声明一个无向图。

示例

digraph g{
	a->b
}

001

graph g{
	a--b
}

002

声明subgraph

subgraph的声明格式如下:

[ subgraph [ ID ] ] '{' stmt_list '}'

subgraph关键字和ID标识不是必须的。subgraph有三个作用

分组

subgraph可用于分组图形结构,让某些节点和边应分组在一起。

digraph t{
	A -> {B C}
}

等同于

digraph t{
	A -> B 
	A -> C
}

003

统一属性

subgraph可以为分组的节点设置统一的属性。

digraph g{
	subgraph { 
		node [shape = box, color = red]
		A; B; C; 
	}
}

004

特殊布局

如果subgraph的名称以cluster开头,Graphviz会将子图记为特殊的cluster。如果布局引擎支持cluster,则会将属于cluster的节点绘制在一起,并将subgraph的整个图形包含在矩形边框内。

digraph g{
	graph [compound=true]
	subgraph cluster_001{ 
		label="cluster_001"
		node [shape = box, color = red]
		A; B; C; 
	}
	subgraph cluster_002{ 
		label="cluster_002"
		node [shape = box, color = green]
		D; E; F; 
	}
	subgraph cluster_003{ 
		label="cluster_003"
		node [shape = box, color = blue]
		G; H;
	}
	A->E 
	F->G
	A->G[lhead=cluster_003,ltail=cluster_001 ]
	B->F
}

004

cluster subgraph不是DOT语言的一部分,并不是所有布局引擎都遵守这个语法约定。

注意:subgraph会继承上级图形的属性。

strict修饰符

图可以以strict修饰,表示严格模式,此模式禁止创建多个Edge(翻译为“边缘”,在Graphviz中表现为图形的关联关系)。

示例:

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

004

上图ab之间只会有一个Edge,颜色为蓝色。

Node的声明

格式如下:

node_id [ attr_list ]

示例:

digraph g{
	graph [bgcolor=red]
	A[color=blue,fontcolor=green]

	A->B
}

Node常用的属性:

  • shape - 设置结点形状,Graphviz支持的图形参见: Node Shapes
  • label - 设置结点的显示内容,内容用双引号包含,可以使用转义字符。可以在结点中内容与结点名称不相同时使用
  • style - 设置结点的样式,取值:filled(填充) , invisible(不可见) , diagonals(斜线) , rounded(圆角) , dashed(虚线) , dotted(点构成的线) , solid(实线) , bold(加粗),可以是多个以,分割的值
  • color - 设置边框颜色
  • fillcolor - 设置填充颜色,仅style = filled时有效。颜色列表参见: Color Names
  • width - 设置结点宽度
  • height - 设置结点高度
  • peripheries - 设置结点边框个数
  • fontcolor - 设置结点内容颜色

Edge声明

(node_id | subgraph) ( '->' | '--' ) (node_id | subgraph) [ attr_list ]

示例

digraph g{
	A -> B [style = dashed, label = "from A to B"];
}

Edge的常用属性:

  • style - 设置边的形状
  • label - 设置边标签。内容用双引号包含,可以使用转义字符
  • color - 设置边颜色
  • arrowhead - 设置结点箭头样式 参见: Arrow Shapes

元素属性

DOT可以为图,节点,Edge设置属性,格式如下:

(graph | node | edge) '[' [ a_list ] ']' [ attr_list ]

完整的属性列表,参见: Node, Edge and Graph Attributes

示例:

digraph g{
	graph [bgcolor=green]
	node [color=blue,shape=polygon, sides=5]
	edge [color=red]
	
	a->b
}

007

对于图,属性设置可以写在graph []里,也可以写在外面

digraph g {
    bgcolor = red;
    graph [bgcolor = red];
}