dot 语法总结
在使用pprof
分析go
的项目时,经常会查看各项指标的有向图
原理是使用Graphviz
(Graph Visualization Software)解析生成的dot
脚本得到最终展示给我们的图信息。
dot
是Graphviz
用于画有向图和无向图语言,语法简单。
dot
的抽象语法
[ strict ] (graph | digraph) [ ID ] '{' stmt_list '}'
dot
支持无向图graph
和有向图digraph
的绘制,无向图可以理解为没有箭头的有向图,我们直接可以在有向图的edge
上使用属性dir=none
下面的无象图graph
和有向图digraph
结果是一样的
graph G1 {
a -- b;
a -- d;
b -- c;
d -- c;
}
digraph G1 {
edge [dir=none];
a -> b;
a -> d;
b -> c;
d -> c;
}
注意无向图(graph)的边用的是--
而有向图(digraph)用的是->
,除了这点,其他的属性基本都是通用的。
关键字
- node:节点属性
- edge:连线属性
- graph:图属性,或声明一个无向图时使用
- digraph:有向图
- subgraph:声明子视图,名字要以
cluster
开头。 - strict:严格模式,用于防止相同的两个节点间使用重复的连线。
节点和属性
声明一个节点直接输入节点的名字就可以,如果有多个节点在同一行可以使用空格或者;
进行分隔。
digraph G1 {
a;
b; c;
"x.y";
}
如果节点的名字有特殊比如.
可以用双引号把字符串包起来
边
两个节点直连,可以直接用->
相连可以,如果一个节点连接多个其他的节点我们可以用{}
把节点包起来如下面的a -> {d; "x.y"};
digraph G1 {
a -> b;
a -> c [dir=back];
a -> {d; "x.y"};
}
如果想要控制边的方向可以使用dir
属性,比如 a -> c [dir=back];
label
dot
可以为所有的元素添(graph
, node
, edge
)加label
,比如我们的node
默认情况下显示的就是他的名字。如果我们想换一个名字可以使用label
来进行修改,label
不仅支付字符串,而且支持html
,html
内容要放在要用<>
。
如果 shape= record
label
还可以创建分组
digraph G {
label = "https://github.com/lpxxn"
n1 [label="hello world"];
a -> b[label=abc];
c [label=<Test<BR /><FONT POINT-SIZE="10">Group: g2</FONT>>; color=orange];
d [shape = record, label="{x|y|z}"]
}
属性
节点和边只是最基本的需求,我们想要图、节点和边的颜色都不相同
digraph G1 {
graph[bgcolor=lightblue];
a [color=blue; style=filled; fontcolor=green];
a -> b [color=red; label=A];
edge [color=green]
a -> {c; "x.y"};
}
graph
全局图属性,比如我们把背景颜色变也了淡蓝色,图属性是全局的,除了在graph[]
里使用,我们也可以在graph[]
外使用,比如控制图的方向rankdir=LR
node
全局节点属性,我们可以控制全局的节点属性比如我们可以控制所有节点的形状
edge
全局的边属性
下面就是把图,节点和边的属性进行了简单设置
digraph G1 {
graph[bgcolor=lightblue];
rankdir=LR
node[shape=box];
a [color=blue; style=filled; fontcolor=green];
a -> b [color=red; label=A; dir=back];
edge [color=green]
a -> {c; "x.y"};
"x.y" -> "x.y";
}
子视图
一个视图可以包含多个子视图,子视图的名字必须要以cluster
开头。
子视图内的节点相连接,如果不想尾部在子视图内,要使用compound=true
属性,连线要加上ltail=cluster_2
告诉引擎尾部在哪里。
digraph G1 {
rankdir=RL;
graph [compound=true];
subgraph cluster_1 {
label = "https://github.com/lpxxn";
edge [dir=none, color=green];
A; B; C;
};
N1 [shape=diamond label=<hello<BR /><FONT POINT-SIZE="10">world</FONT>> color=orange];
subgraph cluster_2 {
label = "https://github.com/lpxxn";
edge [color=red];
D; E;
};
D -> N1 [ltail=cluster_2];
N1 -> B;
E -> C;
}
总结
除了上面提到的一些属性还有很多其他的功能,比如箭头的样式等等。可以参考文档
图 : https://graphviz.org/doc/info/attrs.html
形状: https://graphviz.org/doc/info/shapes.html
箭头: https://graphviz.org/doc/info/arrows.html
dot 语法总结的更多相关文章
- dot 语法全介绍
0. 保存 保存为 pdf:dot -Tpdf iris.dot -o iris.pdf 1. 基本 (1)无向图.有向图.子图 graph G {} // 无向图 digraph G {} // 有 ...
- Swift2.1 语法指南——扩展
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- DOT + graphviz 轻松画图
一.简介DOT & graphviz1. DOT DOT是一种文本图形描述语言.DOT语言文件通常具有.gv或是.dot的文件扩展名.当然,在编写好.dot或者.gv的文件之后,需要有专 ...
- dot.js使用心得
一.dot.js介绍 最近用到的数据模板引擎有很多,今天讲的doT.js也是其中一种. doT.js的特点是体积小,速度快,并且不依赖其他插件. 官网下载:http://olado.github.io ...
- Swift语法3.03(类型Types)
类型 在Swift中,有两种类型:命名型类型和复合型类型.命名型类型是在定义时可以给定的特定名字的类型.命名型类型包括类,结构体,枚举和协议.例如,自定义的类MyClass的实例拥有类型MyClass ...
- Lua面向对象设计
首先对于Lua语言,它没有打算被用来进行大型的程序设计,相反,Lua目标定于小型到中型的程序设计,通常是作为大型系统的一部分,所以它只提供了一套精简的元素,很多高级语言的概念都没有.这样Lua就成为了 ...
- breakpoints、lldb 和 chisel 的使用
http://www.cocoachina.com/ios/20150803/12805.html Breakpoints BreakPoint分类 breakpoint也是有分类的,我这里的文章内大 ...
- 绘图工具graphviz学习使用
画图工具: http://www.tuicool.com/articles/r2iAfa http://www.tuicool.com/articles/RjQfey 绘图工具graphviz学习使用 ...
- Lua面向对象设计(转)
首先对于Lua语言,它没有打算被用来进行大型的程序设计,相反,Lua目标定于小型到中型的程序设计,通常是作为大型系统的一部分,所以它只提供了一套精简的元素,很多高级语言的概念都没有.这样Lua就成为了 ...
随机推荐
- 第48天学习打卡(HTML 行内元素和块元素 列表 表格 视频和音频 页面结构分析 iframe内联框架 表单语法 )
行内元素和块元素 块元素 无论内容多少,该元素独占一行 (p.h1-h6) 行内元素 内容撑开宽度,左右都是行内元素的可以排在一行 (a.strong.em...) 列表 什么是列表 ...
- 微信小程序3D轮播图
<!-- 轮播图 --> <swiper previous-margin='50px' next-margin='50px' bindchange="swiperChang ...
- HDOJ-6666(简单题+模拟题)
quailty and ccpc hdoj-6666 题目很简单,按照题目的意思模拟就行了,排序. #include<iostream> #include<cstdio> #i ...
- 10个顶级Python实用库,推荐你试试!
为什么我喜欢Python?对于初学者来说,这是一种简单易学的编程语言,另一个原因:大量开箱即用的第三方库,正是23万个由用户提供的软件包使得Python真正强大和流行. 在本文中,我挑选了15个最有用 ...
- FreeRedis分布式锁实现以及使用
前言 今日上班听到同事在准备面试题分布式锁(准备溜溜球),随即加入了群聊复习了一波,于是有了这篇小作文. 场景 本文中的演示 DEMO, 以下订单减库存为例. 无锁裸奔表现 示例代码: 先来模拟一个库 ...
- Python开发环境从零搭建-02-代码编辑器Sublime
想要从零开始搭建一个Python的开发环境说容易也容易 说难也能难倒一片开发人员,在接下来的一系列视频中,会详细的讲解如何一步步搭建python的开发环境 本文章是搭建环境的第2篇 讲解的内容是:安装 ...
- vue项目安装sass步骤等遇到的问题
1.安装sass依赖包 npm install --save-dev sass-loader 注释(可能会出现问题:sass-loader版本过高导致,可以将其package.json中的版本改为7. ...
- P2023 [AHOI2009]维护序列 题解(线段树)
题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...
- android分析之Binder 02
分析Java层的ServiceManager,看看Binder在Java层是如何实现的. public final class ServiceManager { private static fina ...
- 第三单元总结——JML契约式编程
OO第三单元博客作业--JML与契约式编程 OO第三单元的三次作业都是在课程组的JML规格下完成.完成作业的过程是契约式编程的过程:设计者完成规格设计,实现者按照规格具体实现.作业正确性的检查同样围绕 ...