graphviz dot语言学习笔记


<一> graphviz dot 使用步骤

  1. 安装graphvizbrew install graphviz (mac os x系统)
  2. 创建文本文件并命名为*.dot, 编写dot脚本
  3. 在第二部创建的文件中编写脚本
  4. 编译脚本, 输出图片
    • 编译命令: dot -Tpng *.dot -o *.png
    • 记得把 * 换成具体的文件名, 这样你就成功的用脚本渲染出你要绘制的图片啦

<二> graphviz dot语言相关知识

  1. 注释
  • 使用双斜杠注释
  1. 有向图
  2. 使用digraph定义有向图
  3. 使用->表述节点之间的关系
  4. 如:
```dot
digraph g {
    a->b;
    b->c;
    c->a;
}
```
效果如下: 
a.png
  1. 无向图
  2. 使用graph定义无向图
  3. 使用 -- 表述节点之间的关系
  4. 节点之间的关系
  • 表述节点直接的关系如下:
    1. 有向图: a -> b, a节点指向b节点
    2. 无像图: a -- b, a节点与b节点连通
  1. 定义节点属性
  2. 定义属性, 格式为: node[attribute1=value1, attribute2=value2]
  3. 如:
```
//定义a节点为长方形, 节点显示的文本为"Hello world"样式为填充, 填充颜色为#ABACBA
a[shape=box,label="Hello world",style=filled,fillcolor="#ABACBA"];
```
  1. 各种形状请参考下面第7条
  2. 定义关系属性(即连接两个节点之间的线的样式)
  3. 定义节点的形状
  4. 栗子:
```dot
  //定义节点属性
  digraph g {
      //==========定义节点关系============
      a->b;
      b->c;
      c->a;
      c->d->e->f;
      d->g;
      e->h;
      //==========定义节点属性============
      //定义a节点为长方形, 样式为填充, 填充颜色为#ABACBA
      a[shape=box,label="Server1\nWebServer",fillcolor="#ABACBA",style=filled];
      //定义b为5边形, 标签为"bb", 样式为填充, 填充色为red
      b[shape=polygon,sides=5,label="bb",style=filled,fillcolor=red];
      //c, 默认为椭圆
      d[shape=circle]; //园
      e[shape=triangle]; //三角形
      f[shape=polygon, sides=4, skew=0.5]; //平行四边形
      g[shape=polygon, distortion=0.5]; //梯形, 上边长
      h[shape=polygon, distortion=-.5]; //梯形, 下边长
  }
```
 效果如下: 
a.png
  1. 哈希表(hash table)
```
digraph g {
    nodesep = .5;
    rankdir = LR;    //指定绘图的方向 (LR从左到右绘制)

    //定义竖直节点
    node[shape=record, width=.1, height=.1];
    node0[label="<f0> |<f1> |<f2> |<f3> |<f4> |<f5> |<f6> ", height=2.5]; //我是一个属性, 我有7个属性

    //定义横向节点
    node[width=1.5];
    node1[label="{<n> a13 | 111 | <p>}"]; //我也是一个节点, 定义了3个属性
    node2[label="{<n> hello | 2387 | <p>}"];
    node3[label="{<n> g23 | 344 | <p>}"];
    node4[label="{<n> k535 | 246 | <p>}"];
    node5[label="{<n> h25 | 13 | <p>}"];
    node6[label="{<n> dj | 04 | <p>}"];
    node7[label="{<n> sbd | 0x543 | <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;
}
```
效果如下:  
![a.png](http://upload-images.jianshu.io/upload_images/1642441-4a6b6edecad8f422.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  1. 更多形状
* 请参考[官方文档](http://www.graphviz.org/Documentation.php)  
* 或者下面  
271314316446130.jpg
  1. 定义结构
    1. 一个简单的数据结构示例
    digraph g {
      node[shape=record,height=.1]; //定义了下面的node样式
    
      node0[label="<f0> |<f1> A|<f2> "]; //我是一个node, 我有三个属性, 第二个属性名字为A, 其他两个为空
      node1[label="<f0> |<f1> B|<f2> "];
      node2[label="<f0> |<f1> C|<f2> "];
      node3[label="<f0> |<f1> D|<f2> "];
      node4[label="<f0> |<f1> E|<f2> "];
      node5[label="<f0> |<f1> F|<f2> "];
      node6[label="<f0> |<f1> H|<f2> "];
      node7[label="<f0> |<f1> I|<f2> "];
      node8[label="<f0> |<f1> J|<f2> "];
      node9[label="<f0> |<f1> K|<f2> "];
    
      "node0":f2 -> "node1": f1; //node0的第三个属性连到node1的第二个属性
      "node1":f0 -> "node2": f1;
      "node1":f1 -> "node3": f2;
      "node3":f0 -> "node4": f0;
      "node3":f1 -> "node5": f1;
      "node3":f2 -> "node6": f2;
      "node6":f1 -> "node7": f1;
      "node7":f1 -> "node8": f0;
      "node2":f2 -> "node9": f1;
    }
    

    效果如下:


    a.png
    1. 使用node定义结构, node[shape=record]

    2. 使用subgraph定义子图

      digraph g {
          //定义一个子图, subgraph定义子图
          subgraph cluster0 {
              node[style=filled, color=white];  //定义子图中的节点的样式
              style=filled; //定义子图的样式
              color=red; //定义子图的填充色
              a0->a1->a2->a3; //定义节点, 及节点之间的关系
              label="process #1"; //定义子图的标签
           }
      
         //又定义一个子图
         subgraph cluster1 {
            node[style=filled, color=white];
            style=filled;
            color=blue; //定义子图的填充色
            b0->b1->b2->b3; //定义节点及其关系
            label="process #2";
            labelColor=white;
         }
      
          //定义子图之间的关系
          start->a0;
          start->b0;
          a1->b3;
          b2->a3;
          a3->end;
          b3->end;
      }
      

      效果如下:

      demo6.png
    3. 更多结构请参考官方文档

    4. 常用颜色如下:


      271313527842101.jpg
  2. 定义关系的样式(节点之间的连线的样式)
    1. 有向图

      digraph g {
        //edge[style=dashed]; //定义边的样式, 虚线
        node[peripheries=2, style=filled, color="#eecc80"];
        a->b [color=red, style=dashed]; //定义边的颜色, 红色 (b和方括号之间必须有空格)
        b->c; //箭头, 三角形; 箭尾, 菱形
        b->d [arrowhead=box]; //箭头, 长方形
        b->e [dir=none]; //没有箭头
        d->f [dir=both]; //双向箭头
        f->h [label=go]; //定义edge的标签
        f->k [arrowhead=diamond]; //更改箭头形状 (更多箭头形状请参考官方文档: http://www.graphviz.org/content/arrow-shapes)
        k->y [headlabel="哈哈", taillabel="洗洗"];
      }
      

      效果如下:

      a.png

    2. 无向图

       graph g {
        edge[style=dashed]; //定义边的样式, 虚线
        a -- b [color=red]; //定义边的颜色, 红色 (b和方括号之间必须有空格)
      }
      

      效果如下:

      demo8.png

references:
graphviz官网
graphviz文档地址
dot官方文档
使用graphviz绘制流程图

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • brew install graphvizvi lz.dot dot -Tjpg lz3.dot -o lz3.j...
    神刀阅读 2,510评论 0 0
  • 从开学到现在已经一个月了,很快。一个月我画了大概20设计图。各种各样的,但是都是一个套路。重复性很高,如果你没有足...
    小八妞妞阅读 188评论 0 0
  • 2017年6月28,星期三,天气:晴 今天于浩晨放学回来告诉了我两件事情。第一件事说:妈妈,我可高兴了,今天阿姨给...
    于浩晨妈妈阅读 536评论 0 3
  • 《水浒传》第五回中,山寨王周通看上了桃花庄刘太公的独生女,硬要把她娶上山。路过桃花庄的鲁智深受到刘太公的款待后,出...
    爱吃鱼的企鹅阅读 1,014评论 0 0
  • 德之有道,标之有底,与众所遵;规立成,行必守,焉可折翼从。国安于平,兴邦为礼,解颐颇受;歌赋颂,沉舸祛,何耐...
    吴枫WF阅读 285评论 0 0