在使用pprof分析go的项目时,经常会查看各项指标的有向图

原理是使用Graphviz(Graph Visualization Software)解析生成的dot脚本得到最终展示给我们的图信息。

dotGraphviz用于画有向图和无向图语言,语法简单。

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不仅支付字符串,而且支持htmlhtml内容要放在要用<>

如果 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 语法总结的更多相关文章

  1. dot 语法全介绍

    0. 保存 保存为 pdf:dot -Tpdf iris.dot -o iris.pdf 1. 基本 (1)无向图.有向图.子图 graph G {} // 无向图 digraph G {} // 有 ...

  2. Swift2.1 语法指南——扩展

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  3. DOT + graphviz 轻松画图

    一.简介DOT & graphviz1. DOT    DOT是一种文本图形描述语言.DOT语言文件通常具有.gv或是.dot的文件扩展名.当然,在编写好.dot或者.gv的文件之后,需要有专 ...

  4. dot.js使用心得

    一.dot.js介绍 最近用到的数据模板引擎有很多,今天讲的doT.js也是其中一种. doT.js的特点是体积小,速度快,并且不依赖其他插件. 官网下载:http://olado.github.io ...

  5. Swift语法3.03(类型Types)

    类型 在Swift中,有两种类型:命名型类型和复合型类型.命名型类型是在定义时可以给定的特定名字的类型.命名型类型包括类,结构体,枚举和协议.例如,自定义的类MyClass的实例拥有类型MyClass ...

  6. Lua面向对象设计

    首先对于Lua语言,它没有打算被用来进行大型的程序设计,相反,Lua目标定于小型到中型的程序设计,通常是作为大型系统的一部分,所以它只提供了一套精简的元素,很多高级语言的概念都没有.这样Lua就成为了 ...

  7. breakpoints、lldb 和 chisel 的使用

    http://www.cocoachina.com/ios/20150803/12805.html Breakpoints BreakPoint分类 breakpoint也是有分类的,我这里的文章内大 ...

  8. 绘图工具graphviz学习使用

    画图工具: http://www.tuicool.com/articles/r2iAfa http://www.tuicool.com/articles/RjQfey 绘图工具graphviz学习使用 ...

  9. Lua面向对象设计(转)

    首先对于Lua语言,它没有打算被用来进行大型的程序设计,相反,Lua目标定于小型到中型的程序设计,通常是作为大型系统的一部分,所以它只提供了一套精简的元素,很多高级语言的概念都没有.这样Lua就成为了 ...

随机推荐

  1. 优化程序性能(CSAPP)

    [前言]虽然现在没有接触过大型项目,但是工作了会注重性能.学习一下,应该能更好更快的理解别人写的经典优化的代码.结合CSAPP和自己的理解,总结一下. 一.程序优化综述 1.高效程序的特点 (1)适当 ...

  2. JUC-ThreadLocalRandom

    目录 Radndom类的局限性 ThreadLocalRandom 这个类是在JDK7中新增的随机数生成器,它弥补了Random类在多线程下的缺陷. Radndom类的局限性 在JDK7之前包括现在j ...

  3. MySQL:初识数据库

    对于大型互联网公司来说,数据的重要性可能比软件本身更重要.据说淘宝业务系统的开发大概消耗约7000万人民币,而其保存的用户数据的价值远高于此,加上数据分析算法的加持,其产生的价值和收益无疑是巨大的,远 ...

  4. springboot源码解析-管中窥豹系列之自动装配(九)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  5. Cloud Alibabab笔记问世,全网详解仅此一份手慢无

    转: Cloud Alibabab笔记问世,全网详解仅此一份手慢无 什么是Spring cloud alibaba Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案, ...

  6. 最新版大数据平台安装部署指南,HDP-2.6.5.0,ambari-2.6.2.0

    一.服务器环境配置 1 系统要求 名称 地址 操作系统 root密码 Master1 10.1.0.30 Centos 7.7 Root@bidsum1 Master2 10.1.0.105 Cent ...

  7. CVE-2019-2618 任意文件上传

    漏洞描述:CVE-2019-2618漏洞主要是利用了WebLogic组件中的DeploymentService接口,该接口支持向服务器上传任意文件.攻击者突破了OAM(Oracle Access Ma ...

  8. rest framework Request

    要求 如果你正在做基于REST的Web服务的东西......你应该忽略request.POST. -马尔科姆Tredinnick,Django开发组 REST框架的Request类继承了标准HttpR ...

  9. 内省详解(Introspector/BeanInfo/MethodDescriptor/PropertyDescriptor)

    内省(Introspector)概念 ​ 内省Introspector 是Java提供的操作 JavaBean 的 API,用来访问某个属性的 getter/setter 方法.对于一个标准的 Jav ...

  10. 我与FreeBSD的故事之一

    记得还是那些无聊的日子,群里有网友称Linux只能玩WPS,我表示质疑,并通过百度这个搜索引擎搜索到了Ubuntu Kylin,即由湖南的国防科技大学与Ubuntu社区合作并由其主导的Ubuntu麒麟 ...