• 程序员的绘图利器 — Graphviz


    概述

    官网:http://www.graphviz.org/

    Graphviz (Graph Visualization Software) 是一个由AT&T实验室启动的开源工具包。DOT是一种图形描述语言,非常简单的,

    Graphviz就是用来处理这种语言的工具。只需要简单了解一下DOT语言,就可以用Graphviz绘图了,它对程序员特别有用。

    So in short, if you are a programmer, it is born for you。

    无向图

    graph graphname {
        a -- b -- c;
        b -- d;
    }

    有向图

    digraph graphname {
        a -> b -> c;
        b -> d;
    }

    属性

    //DOT语言中,可以对节点和边添加不同的属性。
    
    digraph graphname {
        //节点的属性,节点的名称
        a [lable = "Foo"];
    
        //节点的属性,节点的形状
        b [shape = box];
    
        //边的属性,边的颜色
        a -> b -> c [color = blue];
    
        //边的属性,边的线状
        b -> d [style = dotted];
    }
    

    基本图形

    digraph G {
    //把图片的尺寸设为4inch * 4inch
    size = "4,4";
    main [shape = box];
    
    //边的重要程度,默认是1
    main->parse [weight = 8];
    parse->execute;
    
    //点状线
    main->init[style = dotted];
    main->cleanup;
    
    //连接了两条线
    execute->{make_string;printf}
    init->make_string;
    
    //把边的默认颜色设为red
    edge [color = red];
    main->printf [sytle=bold, label = "100times"];
    
    //节点的名称
    make_string [label = "make a\nstring"];
    
    //设置节点的默认属性
    node [shape=box,style =filled,color=lightgrey];
    execute->compare;
    }
    

    多边形

    digraph G{
    a -> b -> c;
    b -> d;
    
    /* 形状为多边形,边数为5,外框为3条,颜色为淡蓝,样式为填充 */
    a [shape = polygon, sides = 5, peripheries = 3, color = lightblue, style = filled];
    
    /* 形状为多边形,边数为4,角的倾斜度为0.4,内容为hellow world*/
    c [shape = polygon, sides = 4, skew = 0.4, label = "hello world"];
    
    /* 形状为倒三角,整体旋转30度 */
    d [shape = invtriangle,orientation = 30];
    
    /* 形状为多边形,边数为4,扭曲度为0.7 */
    e [shape = polygon, sides = 4, distortion = 0.7];
    }
    

    数据结构

    (1)复杂的标签

    digraph structs {
    /* 把节点的默认形状设为矩形record,默认的是圆角矩形Mrecord */
    node [shape = record];
    
    struct1 [label = "left|middle|right"];
    struct2 [label = "one|two"];
    struct3 [label = "hello\nworld|{b|{c|d|e}|f}|g|h"];
    
    struct1 -> struct2;
    struct1 -> struct3;
    }
    


    graph picture {
    //这幅图的名字
    label = "I love you";
    
    //图名字的位置在bottom,也可以是t
    labelloc = b;
    
    //图名字的位置在left,也可以是r
    labeljust = l;
    
    edge[decorate = true];
    
    C -- D [label = "s1"];
    C -- E [label = "s2"];
    C -- F [label = "s3"];
    D -- E [label = "s4"];
    D -- F [label = "s5"];
    
    edge[decorate = false, labelfontcolor = blue, fontcolor = red];
    C1 -- D1 [headlabel = "c1",taillabel = "d1",label = "c1 - d1"];
    }


     

    (2)行列对齐

    digraph html {
    rankdir = LR;
    {
    node[shape = plaintext];
    1995 -> 1996 -> 1997 -> 1998 -> 1999 -> 2000 -> 2001;
    }
    {
    node[shape = box, style = filled];
    WAR3 -> Xhero -> Footman -> DOTA:
    WAR3 -> Battleship;
    }
    {rank = same; 1996; WAR3;}
    {rank = same; 1998; Xhero; Battleship;}
    {rank = same; 1999; Footman;}
    {rank = same; 2001; DOTA;}
    }

    (3)二叉树

    digraph G {
    label = "Binary search tree";
    node [shape = record];
    
    A [label = "<f0>|<f1>A|<f2>"];
    B [label = "<f0>|<f1>B|<f2>"];
    C [label = "<f0>|<f1>C|<f2>"];
    D [label = "<f0>|<f1>D|<f2>"];
    E [label = "<f0>|<f1>E|<f2>"];
    F [label = "<f0>|<f1>F|<f2>"];
    G [label = "<f0>|<f1>G|<f2>"];
    
    A:f0 -> B:f1;
    A:f2 -> C:f1;
    B:f0 -> D:f1;
    B:f2 -> E:f1;
    C:f0 -> F:f1;
    C:f2 -> G:f1;
    }
    

    (4)哈希表

    digraph G{
    nodesep = .05;
    rankdir = LR;
    
    node [shape = record,width = .1,height = .1];
    node0 [label = "<f0>|<f1>|<f2>|<f3>|<f4>|<f5>|<f6>|",height = 2.5];
    
    node [width = 1.5];
    node1 [label = "{<n>n14|719|<p>}"];
    node2 [label = "{<n>a1|805|<p>}"];
    node3 [label = "{<n>i9|718|<p>}"];
    node4 [label = "{<n>e5|989|<p>}"];
    node5 [label = "{<n>t20|959|<p>}"];
    node6 [label = "{<n>o15|794|<p>}"];
    node7 [label = "{<n>s19|659|<p>}"];
    
    node0:f0 -> node1:n;
    node0:f1 -> node2:n;
    node0:f2 -> node3:n;
    node0:f5 -> node4:n;
    node0:f6 -> node5:n;
    node2:p -> node6:n;
    node4:p -> node7:n;
    }
    


     

    流程图

    digraph G{
    subgraph cluster0 {
    node [style = filled,color = white];
    style = filled;
    color = lightgrey;
    a0 -> a1 -> a2 -> a3;
    label = "process #1";
    }
    
    subgraph cluster1 {
    node [style = filled];
    b0 -> b1 -> b2 -> b3;
    label = "process #2";
    color = blue;
    }
    
    start -> a0;
    start -> b0;
    a1 -> b3;
    b2 -> a3;
    a3 -> a0;
    a3 -> end;
    b3 -> end;
    start [shape = Mdiamond];
    end [shape = Msquare];
    }
    


    Reference

    [1] http://zh.wikipedia.org/zh-cn/DOT语言,DOT语言简明介绍。

    [2] http://zh.wikipedia.org/zh/Graphviz,简单背景知识。

    [3] Graphviz中文指南。

  • 相关阅读:
    tcp/ip网络分层 紫翼龙王
    软件防火墙之iptables/netfilter概念篇(一) 紫翼龙王
    linux cpu负载详解 紫翼龙王
    ThinkInJava4读书笔记之第五章隐藏实施过程
    ThinkInJava4读书笔记之第六章类继承
    工具类sql操作工具类
    python 面向对象
    python 初识
    python 函数,内置函数
    python 正则,os,sys,hashlib模块
  • 原文地址:https://www.cnblogs.com/aiwz/p/6333366.html
Copyright © 2020-2023  润新知