前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >dot 语法总结

dot 语法总结

作者头像
lpxxn
发布2021-04-01 10:20:09
1.7K0
发布2021-04-01 10:20:09
举报
文章被收录于专栏:技术之路技术之路

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

原理是使用Graphviz(Graph Visualization Software)解析生成的dot脚本得到最终展示给我们的图信息。 dotGraphviz用于画有向图和无向图语言,语法简单。 dot的抽象语法

代码语言:javascript
复制
[ strict ] (graph | digraph) [ ID ] '{' stmt_list '}'

dot支持无向图graph和有向图digraph的绘制,无向图可以理解为没有箭头的有向图,我们直接可以在有向图的edge上使用属性dir=none 下面的无象图graph和有向图digraph结果是一样的

代码语言:javascript
复制
graph G1 {
    a -- b;
    a -- d;
    b -- c;
    d -- c;
}
代码语言:javascript
复制
digraph G1 {
    edge [dir=none];
    a -> b;
    a -> d;
    b -> c;
    d -> c;
}

注意无向图(graph)的边用的是--而有向图(digraph)用的是->,除了这点,其他的属性基本都是通用的。

关键字

  • node:节点属性
  • edge:连线属性
  • graph:图属性,或声明一个无向图时使用
  • digraph:有向图
  • subgraph:声明子视图,名字要以cluster开头。
  • strict:严格模式,用于防止相同的两个节点间使用重复的连线。

节点和属性

声明一个节点直接输入节点的名字就可以,如果有多个节点在同一行可以使用空格或者;进行分隔。

代码语言:javascript
复制
digraph G1 {
    a;
    b; c;
    "x.y";
}

如果节点的名字有特殊比如.可以用双引号把字符串包起来

两个节点直连,可以直接用->相连可以,如果一个节点连接多个其他的节点我们可以用{}把节点包起来如下面的a -> {d; "x.y"};

代码语言:javascript
复制
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还可以创建分组

代码语言:javascript
复制
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}"]
}

属性

节点和边只是最基本的需求,我们想要图、节点和边的颜色都不相同

代码语言:javascript
复制
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全局的边属性 下面就是把图,节点和边的属性进行了简单设置

代码语言:javascript
复制
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告诉引擎尾部在哪里。

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-03-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关键字
  • 节点和属性
      • label
        • 属性
          • 子视图
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档