zoukankan      html  css  js  c++  java
  • dot 语法总结

    在使用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

    作者:李鹏
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    系统右键菜单添加剪贴板清空项(隐藏DOS窗口)
    C++实现黄金分割数列(斐波纳奇数列)(非递归)
    vbs让电脑发音说话
    修改远程桌面端口号.bat
    C#实现鸽巢排序
    C++用递归方式实现在对不更改随机数组的情况下查找最大值
    C# 实现 微软WebRequestMethods.Ftp类中的FTP操作功能
    C# “快捷方式” 实现程序开机启动
    C++ DateTime 结构
    C# UDP 连接通信 简单示例
  • 原文地址:https://www.cnblogs.com/li-peng/p/14565148.html
Copyright © 2011-2022 走看看