DOT语言速学
0x00 资源
- DOT语言在线显示:Graphviz Visual Editor
- DOT语言官方权威文档:Graphviz Documentation
- DOT工具链安装:Graphviz Download Page
- DOT语言作品欣赏:Graphviz Gallery
0x01 基本语法
1. 图 (Graph)
DOT语言支持 有向图(digraph) 和 无向图(graph) 两种图类型的定义,定义的基本语法如下:
1 | // 这是dot无向图的定义方法, 使用 -- 进行边的连接 |
可以看到,主要的区别在于定义词和连接词不同。
note
字符串特注:对于不含空格的字符串,可以不加单引号和双引号简化。
2. 图的节点(Node)
分为隐式定义和显式定义
A -> B;定义边的同时会隐式定义未定义的 A 和 B 两个节点A [label = 'name of A']会定义一个标签为 name of A 的节点
3. 图的边 (Edge)
如图的类型中所讲,分为无向边和有向边两种
无向边定义:
A -- B有向边定义:
A -> B连续定义:
A -> B -> C
4. 图、节点、边的属性 (Attributes)
针对三种不同的对象,属性的设置有些许区别,具体见如下实例。
1 | digraph G { |
info
图的全局属性直接写在{}内;而节点和边的属性则写在它们各自定义后的[]中
5. 图的子图(Subgraph)
子图也是一种图,继承于父类,通过在父图中嵌套定义来实现。具体语法见下实例。
1 | digraph G { |
info
如果子图的名称以 cluster 开头,Graphviz
会在这些节点周围绘制一个矩形边框,将它们视觉上“聚集”起来。这时候的子图也被称为集群
(Cluster)
6. 注释 (Comment)
DOT语言支持C风格注释
单行注释:
// 这是一行无需多言的注释多行注释:
/* 这是多行废话(实际只写了一行,笑) */
0x02 常见样式
这一部分的内容主要是介绍熟悉中可用的样式(键值对中的键),通过样式的选择可以达到美观的效果。
1. 图样式
| 属性 | 描述 | 常用值 |
|---|---|---|
size |
生成的图的大小(英寸) | “4,4” |
rankdir |
图的布局方式 | TB(Top to Bottom, 默认) LR(Left to
Right) |
bgcolor |
画布背景色 | #RRGGBB |
label |
图标题 | “随便画的图” |
fontsize |
字体大小,全局 | 14 |
splines |
边的绘制 | true(曲线),false或者line(直线)ortho(正交线) |
2. 边样式
| 属性 | 描述 | 常用值 |
|---|---|---|
style |
边的线条样式 | solid(默认),dashed,dotted,bold |
color |
边的颜色 | red(常见颜色基本都有),#RRGGBB |
arrowhead |
箭头样式 | normal,
dot,vee,diamond,
empty, crow |
arrowtail |
箭尾样式 | 同上 |
dir |
边的方向 | forword,back,both,none |
label |
边的标签文本 | “任何的我” |
fontsize |
标签字体大小 | 10,12 |
fontcolor |
字体颜色 | gray |
note
关于边的特别说明:下面这两个都表示A和B两个节点有双向关系,但是其对应的图和边数是不一样的。
-
A -> B -> A有2条边 -
A -> B [dir = "both"]仅有1条边
3. 节点样式
| 属性 | 描述 | 常用值 |
|---|---|---|
shape |
节点形状 | box,ellipse,circle,diamond,record,cylinder,component |
style |
节点基本样式 | filled, dashed, dotted,
bold, rounded |
color |
节点边框颜色 | red,#RRGGBB |
fillcolor |
节点填充颜色(需要style = filled |
yellow,#RRGGBB |
fontname |
节点字体风格 | Arial,
Comic Sans MS,宋体 |
fontsize |
节点字号 | 12, 14 |
fontcolor |
节点字体颜色 | black, white |
0x03 常见用例
下面让Gemini老师给点用例,我先偷会懒哈,前两个是很简单且典型的工程图,最后一个是我闲的没事干了(笑)。
1. E-R 图 (实体关系图)
E-R 图用于表示数据库中的实体、属性和它们之间的关系。
实体 (Entity): 通常使用
record形状的节点来表示,可以将实体名和属性分栏显示。关系 (Relationship): 通常使用
diamond形状的节点。基数 (Cardinality): 使用不同的箭头样式来表示,如
crow(多),tee(一)。
示例:一个简单的“用户-订单”E-R图
1 | digraph ER_Diagram { |
note
字符串转义:三种换行,,/code>代表换行居中,换行靠左,换行靠右
2. UML 类图 (Class Diagram)
类图是面向对象建模的核心,用于展示系统中的类、接口以及它们之间的静态关系。
类 (Class): 使用
record形状,分为三部分:类名、属性(字段)、操作(方法)。关系:
- 继承 (Generalization): 带空心三角箭头的实线
(
arrowhead=empty)。 - 实现 (Realization): 带空心三角箭头的虚线
(
style=dashed, arrowhead=empty)。 - 关联 (Association): 普通实线
(
arrowhead=vee或none)。 - 聚合 (Aggregation): 带空心菱形箭头的实线
(
arrowhead=odiamond)。 - 组合 (Composition): 带实心菱形箭头的实线
(
arrowhead=diamond)。
- 继承 (Generalization): 带空心三角箭头的实线
(
示例:一个简单的“动物”类图
1 | digraph UML_Class_Diagram { |
3. 就决定是你了,水分子 (H2O)
1 | // 画一个角度可控的水分子 (H₂O) |
note
通过neato引擎可以实现无向图的弹簧模型布局,而超模的pos属性可以通过值的最后加上!进行强制指定,具体可以看官方文档。
0x04 工具链和应用
1. 工具链的安装和使用
1.1 安装
参考 Graphviz 官网下载页面 中的说明。
Windows可以直接到这个网站上进行下载.msi或者.exe进行安装。Linux和MacOS的包管理工具一般可以直接安装graphviz
1.2 使用
命令可以通过dot -?进行查询,下面介绍最有用的两种:
info
dot -T<format> [-K<engine>] <input_file> -o
<output_file>
<format> :
文件格式,如 png, svg, jepg, …
<engine>:
指定布局引擎(可选), 如 neato,fdp, circo
<input_file> : 输入的 dot 文件
<output_file> : 输出的图片文件
用例:dot
-Tpng -Kneato my_file.dot -o my_image.png
dot
-T<format> -O <input_file>
<format> : 文件格式,如 png, svg, jepg, …
<input_file> : 输入的 dot 文件
此时生成的文件为<input_file>.<format>
用例:dot -Tsvg -O my_file.dot
2. DOT语言的应用
dot语言相当于提供了一个精确的代码→图的途径,因此在自动化生成图片的方面,dot都可以发挥作用。下面给出我观察到的:
- 逆向工程中控制流图(CFG)的生成
- AI生成DOT文本,然后有客户端进行识别和渲染生成图片
- 数据结构的可视化展示
- 决策树软件自动生成
0x05 更多主题
下面罗列了本博客没有涉及到的但是可能有用的内容,可以自行搜索学习
todo
-
DOT语言完整的文法,比如通过
端口(port)来指定连接点的位置 - DOT语言的属性,这部分非常丰富,建议参考官网和需要按需搜索学习
-
DOT工具链的使用,主要是命令行选项,例如
-G,-E,-N - VS Code的graphviz插件安装及使用
- Python中,graphviz 库(通过生成DOT源码)和 pygraphviz库(通过API直接调用)是两种主流的自动化绘图方式,各有优劣,可按需选择