程序員的繪圖利器 graphviz

馬云曾經(jīng)說過:『一圖勝千言』

graphviz

對于大多數(shù)程序員來說,都不想在樣式方面花太多的時間(至少不是在書寫內(nèi)容的同時去關(guān)心樣式)邑时,這大概就是 markdown 流行的原因之一吧。
同樣的汛闸,在作圖時核无,如果可以不去關(guān)心樣式而把精力集中在圖的內(nèi)容上,那想必是極好的款违。

而繪圖工具 graphviz 和其使用的 dot 語言就是這樣一套『所想即所得』的繪圖工具唐瀑。

dot 語言就是一套 DSL,也就是說插爹,可以把圖片用代碼的形式表現(xiàn)出來哄辣,這樣易于修改请梢,也可以做版本控制。

廢話不多說力穗,下面進入實戰(zhàn)溢陪,首先是安裝,Mac 下:

brew install graphviz

首先看一個例子睛廊,這是一副 tmux 的架構(gòu)圖(出自『tmux 快速入門』

tmux 架構(gòu)

其對應的 dot 文件如下:

digraph tmux{
    node[shape=record]
    subgraph cluster_terminal{
      label ="terminal";
      subgraph cluster_session2{
        label = "session2";
        subgraph cluster_window3 {
          label="window3";
          pane6 [label="ls /tmp"];
        }
        subgraph cluster_window4 {
          label="window4";
          pane7 [label="pane1"]
          pane8 [label="pane2"]
        }
      }
      subgraph cluster_session1{
        label = "session1";

        subgraph cluster_window1 {
          label="window1";
          pane2 [label="ls /tmp"];
        }
        subgraph cluster_window2 {
          label="window2";
          pane3 [label="pane1"]
          pane4 [label="pane2"]
        }
      }
    }
}

這張圖的特點就是其中的內(nèi)容都是簡單的包含關(guān)系形真,所以代碼中使用了大量的 subgraph

再來看一個例子:

run-example

這是一個典型的流程圖超全,觀察它的結(jié)構(gòu)咆霜,可以發(fā)現(xiàn):

  1. 有兩個子圖(客戶端和服務端)
  2. 有一處分叉點
  3. 都是單向關(guān)聯(lián)

根據(jù)『所想即所得』的原則,我們只要先把要表達的東西寫下來:

第一步嘶朱,創(chuàng)建好 nodes:

digraph run{

  edge [style="dashed"];

  a [label="開啟App"];
  b [label="是否登錄"];
  c [label="去登錄"];
  d [label="開始跑步"];
  e [label="相關(guān)跑步數(shù)據(jù)計算"];
  f [label="跑步完成"];
  g [label="數(shù)據(jù)儲存"];
  h [label="分配卡牌"];
  i [label="抽取卡牌"];
  j [label="完成抽取"];
  k [label="儲存抽取卡牌信息"];
}

第二步蛾坯,繪制子圖(客戶端和服務端)

subgraph cluster_client{
      label="客戶端";
      bgcolor="mintcream";
      a;
      b;
      c;
      d;
      e;
      f;
      i;
      j;
    }
    subgraph cluster_server{
      label="服務端";
      bgcolor="mintcream";
      g;
      h;
      k;
    }    

第三步,關(guān)聯(lián)關(guān)系

a -> b;
b -> c;
b -> d;
c -> d;
d -> e;
e -> f;
f -> g;
g -> h;
h -> i;
i -> j;
j -> k;

第四步疏遏,添加關(guān)系描述

a -> b;
b -> c [label="否"];
b -> d [label="是"];
c -> d;
d -> e;
e -> f;
f -> g [label="發(fā)送數(shù)據(jù)"];
g -> h;
h -> i [label="發(fā)送數(shù)據(jù)"];
i -> j;
j -> k [label="發(fā)送數(shù)據(jù)"];

最終代碼如下:

digraph run{

  edge [style="dashed"];

  a [label="開啟App"];
  b [label="是否登錄"];
  c [label="去登錄"];
  d [label="開始跑步"];
  e [label="相關(guān)跑步數(shù)據(jù)計算"];
  f [label="跑步完成"];
  g [label="數(shù)據(jù)儲存"];
  h [label="分配卡牌"];
  i [label="抽取卡牌"];
  j [label="完成抽取"];
  k [label="儲存抽取卡牌信息"];

  subgraph cluster_client{
      label="客戶端";
      bgcolor="mintcream";
      a;
      b;
      c;
      d;
      e;
      f;
      i;
      j;
    }
    subgraph cluster_server{
      label="服務端";
      bgcolor="mintcream";
      g;
      h;
      k;
    }
    a -> b;
    b -> c [label="否"];
    b -> d [label="是"];
    c -> d;
    d -> e;
    e -> f;
    f -> g [label="發(fā)送數(shù)據(jù)"];
    g -> h;
    h -> i [label="發(fā)送數(shù)據(jù)"];
    i -> j;
    j -> k [label="發(fā)送數(shù)據(jù)"];
}

最后使用 dot 命令生成需要的格式即可:

dot -T png source.dot -o dist.png
dist.png

可以看到布局并不如原圖那樣完美脉课,因為 graphviz 本來就是為了讓用戶可以把關(guān)注點放在 node 之間的關(guān)系上而并非布局上,因此做了自動布局财异,這在關(guān)系比較復雜的情況下會非常好用倘零。

使用 dot 語言繪圖可以有效提升生產(chǎn)力并且降低維度成本,并且主流編輯器都有相應插件戳寸,非常推薦程序員和產(chǎn)品經(jīng)理使用呈驶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市疫鹊,隨后出現(xiàn)的幾起案子袖瞻,更是在濱河造成了極大的恐慌,老刑警劉巖拆吆,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聋迎,死亡現(xiàn)場離奇詭異,居然都是意外死亡枣耀,警方通過查閱死者的電腦和手機霉晕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奕枢,“玉大人娄昆,你說我怎么就攤上這事》毂颍” “怎么了萌焰?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谷浅。 經(jīng)常有香客問我扒俯,道長奶卓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任撼玄,我火速辦了婚禮夺姑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掌猛。我一直安慰自己盏浙,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布荔茬。 她就那樣靜靜地躺著废膘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慕蔚。 梳的紋絲不亂的頭發(fā)上丐黄,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音孔飒,去河邊找鬼灌闺。 笑死,一個胖子當著我的面吹牛坏瞄,可吹牛的內(nèi)容都是我干的桂对。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惦积,長吁一口氣:“原來是場噩夢啊……” “哼接校!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狮崩,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹿寻,沒想到半個月后睦柴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡毡熏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年坦敌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痢法。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡狱窘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出财搁,到底是詐尸還是另有隱情蘸炸,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布尖奔,位于F島的核電站搭儒,受9級特大地震影響穷当,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淹禾,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一馁菜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铃岔,春花似錦汪疮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜓洪,卻和暖如春纤勒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隆檀。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工摇天, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恐仑。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓泉坐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親裳仆。 傳聞我的和親對象是個殘疾皇子腕让,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,110評論 25 707
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,751評論 1 92
  • 有時候,孩子可能會因為沒把事情做好静袖,鬧情緒觉鼻,甚至又哭又鬧,這時队橙,我們不要輕易退步坠陈,孩子小,把哭鬧當成法寶捐康,這時仇矾,我...
    孫彬洋媽媽閱讀 192評論 0 0
  • 我終于失去了你 已經(jīng)不見很多個年頭了,也不知道你過得好不好解总,有沒有結(jié)婚贮匕;如果結(jié)婚,妻子是個怎樣的人倾鲫,孩子漂亮嗎粗合、可...
    瓊鯨和掠影閱讀 1,087評論 0 0