graphviz dot語言學習筆記


<一> graphviz dot 使用步驟

  1. 安裝graphvizbrew install graphviz (mac os x系統(tǒng))
  2. 創(chuàng)建文本文件并命名為*.dot, 編寫dot腳本
  3. 在第二部創(chuàng)建的文件中編寫腳本
  4. 編譯腳本, 輸出圖片
    • 編譯命令: dot -Tpng *.dot -o *.png
    • 記得把 * 換成具體的文件名, 這樣你就成功的用腳本渲染出你要繪制的圖片啦

<二> graphviz dot語言相關知識

  1. 注釋
  • 使用雙斜杠注釋
  1. 有向圖
  2. 使用digraph定義有向圖
  3. 使用->表述節(jié)點之間的關系
  4. 如:
```dot
digraph g {
    a->b;
    b->c;
    c->a;
}
```
效果如下: 
a.png
  1. 無向圖
  2. 使用graph定義無向圖
  3. 使用 -- 表述節(jié)點之間的關系
  4. 節(jié)點之間的關系
  • 表述節(jié)點直接的關系如下:
    1. 有向圖: a -> b, a節(jié)點指向b節(jié)點
    2. 無像圖: a -- b, a節(jié)點與b節(jié)點連通
  1. 定義節(jié)點屬性
  2. 定義屬性, 格式為: node[attribute1=value1, attribute2=value2]
  3. 如:
```
//定義a節(jié)點為長方形, 節(jié)點顯示的文本為"Hello world"樣式為填充, 填充顏色為#ABACBA
a[shape=box,label="Hello world",style=filled,fillcolor="#ABACBA"];
```
  1. 各種形狀請參考下面第7條
  2. 定義關系屬性(即連接兩個節(jié)點之間的線的樣式)
  3. 定義節(jié)點的形狀
  4. 栗子:
```dot
  //定義節(jié)點屬性
  digraph g {
      //==========定義節(jié)點關系============
      a->b;
      b->c;
      c->a;
      c->d->e->f;
      d->g;
      e->h;
      //==========定義節(jié)點屬性============
      //定義a節(jié)點為長方形, 樣式為填充, 填充顏色為#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從左到右繪制)

    //定義豎直節(jié)點
    node[shape=record, width=.1, height=.1];
    node0[label="<f0> |<f1> |<f2> |<f3> |<f4> |<f5> |<f6> ", height=2.5]; //我是一個屬性, 我有7個屬性

    //定義橫向節(jié)點
    node[width=1.5];
    node1[label="{<n> a13 | 111 | <p>}"]; //我也是一個節(jié)點, 定義了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>}"];

    //建立節(jié)點之間的聯(lián)系
    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. 定義結(jié)構(gòu)
    1. 一個簡單的數(shù)據(jù)結(jié)構(gòu)示例
    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定義結(jié)構(gòu), node[shape=record]

    2. 使用subgraph定義子圖

      digraph g {
          //定義一個子圖, subgraph定義子圖
          subgraph cluster0 {
              node[style=filled, color=white];  //定義子圖中的節(jié)點的樣式
              style=filled; //定義子圖的樣式
              color=red; //定義子圖的填充色
              a0->a1->a2->a3; //定義節(jié)點, 及節(jié)點之間的關系
              label="process #1"; //定義子圖的標簽
           }
      
         //又定義一個子圖
         subgraph cluster1 {
            node[style=filled, color=white];
            style=filled;
            color=blue; //定義子圖的填充色
            b0->b1->b2->b3; //定義節(jié)點及其關系
            label="process #2";
            labelColor=white;
         }
      
          //定義子圖之間的關系
          start->a0;
          start->b0;
          a1->b3;
          b2->a3;
          a3->end;
          b3->end;
      }
      

      效果如下:

      demo6.png
    3. 更多結(jié)構(gòu)請參考官方文檔

    4. 常用顏色如下:


      271313527842101.jpg
  2. 定義關系的樣式(節(jié)點之間的連線的樣式)
    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官網(wǎng)
graphviz文檔地址
dot官方文檔
使用graphviz繪制流程圖

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末大州,一起剝皮案震驚了整個濱河市桩撮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锨推,老刑警劉巖赘理,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宦言,死亡現(xiàn)場離奇詭異,居然都是意外死亡商模,警方通過查閱死者的電腦和手機奠旺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門蜘澜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人响疚,你說我怎么就攤上這事鄙信。” “怎么了忿晕?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵装诡,是天一觀的道長。 經(jīng)常有香客問我践盼,道長鸦采,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任咕幻,我火速辦了婚禮渔伯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谅河。我一直安慰自己咱旱,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布绷耍。 她就那樣靜靜地躺著吐限,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褂始。 梳的紋絲不亂的頭發(fā)上诸典,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音崎苗,去河邊找鬼狐粱。 笑死,一個胖子當著我的面吹牛胆数,可吹牛的內(nèi)容都是我干的肌蜻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼必尼,長吁一口氣:“原來是場噩夢啊……” “哼蒋搜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起判莉,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤豆挽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后券盅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帮哈,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年锰镀,在試婚紗的時候發(fā)現(xiàn)自己被綠了娘侍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咖刃。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖私蕾,靈堂內(nèi)的尸體忽然破棺而出僵缺,到底是詐尸還是另有隱情,我是刑警寧澤踩叭,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站翠胰,受9級特大地震影響容贝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜之景,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一斤富、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锻狗,春花似錦满力、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刻帚,卻和暖如春潦嘶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崇众。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工掂僵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顷歌。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓锰蓬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親眯漩。 傳聞我的和親對象是個殘疾皇子芹扭,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容

  • brew install graphvizvi lz.dot dot -Tjpg lz3.dot -o lz3.j...
    神刀閱讀 2,596評論 0 0
  • 從開學到現(xiàn)在已經(jīng)一個月了,很快坤塞。一個月我畫了大概20設計圖冯勉。各種各樣的,但是都是一個套路摹芙。重復性很高灼狰,如果你沒有足...
    小八妞妞閱讀 202評論 0 0
  • 2017年6月28,星期三浮禾,天氣:晴 今天于浩晨放學回來告訴了我兩件事情交胚。第一件事說:媽媽份汗,我可高興了,今天阿姨給...
    于浩晨媽媽閱讀 606評論 0 3
  • 《水滸傳》第五回中蝴簇,山寨王周通看上了桃花莊劉太公的獨生女杯活,硬要把她娶上山。路過桃花莊的魯智深受到劉太公的款待后熬词,出...
    愛吃魚的企鵝閱讀 1,119評論 0 0
  • 德之有道旁钧,標之有底,與眾所遵互拾;規(guī)立成歪今,行必守,焉可折翼從颜矿。國安于平寄猩,興邦為禮,解頤頗受骑疆;歌賦頌田篇,沉舸祛,何耐...
    吳楓WF閱讀 294評論 0 0