程序員輕松繪圖神器
我們程序員在工作生活中,有很多場合下需要繪制圖表,比如PPT里的圖表,學(xué)習(xí)筆記的一些助記圖,還有最常見的,工作中大量使用的流程圖。
在 Window 下,我們有很多好用的工具,比如 Visio 、 EA 等等。這些軟件也很好用,但都有個缺點(diǎn),那就是太復(fù)雜。我們需要一定的美工基礎(chǔ),還要學(xué)很多軟件操作,才能畫出一張很簡單的流程圖。
而且,更要命的是,一旦需求發(fā)生變動,很不好修改,往往牽一發(fā)而動全身。所以經(jīng)常在聽到需求變更的時(shí)候,良許就脊背一涼……
后來,在大神的介紹下,良許開始使用一個神器。這個神器不需要你懂美工,也不太需要懂軟件操作,繪圖的過程跟你寫軟件的過程差不多,短短的幾行代碼,就能把你頭腦里的想法表現(xiàn)出來。
而且,不用擔(dān)心布局,不用擔(dān)心修改,甚至都不用鼠標(biāo),也給制作出相當(dāng)精美的作品!
這個神器就是:dot 命令!
這個神器還有個圖形界面版,叫 Graphviz ,但良許習(xí)慣了命令行,一般是在命令行下完成的。
我們先來看下它能做什么。以下幾個圖片選自它的官網(wǎng):



這只是其中的幾張圖而已,更多圖片可以去它的官網(wǎng)查看:http://www.graphviz.org。
這個軟件非常強(qiáng)大,如果掌握得好的話,可以畫出非常好看的作品,而且還不怕產(chǎn)品經(jīng)理改需求。但是,在大多數(shù)情況下,我們不太需要用到它的高級功能,往往一些很基礎(chǔ)的功能就可以應(yīng)付我們工作中的 80% 以上的需求了。
這個軟件的安裝很簡單,只需執(zhí)行以下命令即可:
- sudo apt install graphviz
稍等一小會兒,就安裝成功了。然后,就可以愉快地玩耍啦~
我們先來看看一個 Hello world 水平的作品。
首先,在任意位置創(chuàng)建一個 test.dot 文件(當(dāng)然也可以叫其它名字),文件的內(nèi)容如下:
- graph g{
- "Hello" -- "world"
- }
然后,執(zhí)行以下命令:
- dot -Tpng -o test.png test.dot
之后,就在當(dāng)前目錄下生成了下面這幅最簡單的圖片了,是不是非常簡單?

我們來簡單介紹下 DOT 命令的語法。在 test.dot 文件里,graph 表示的是這幅圖是 無向圖,也就是連接線是沒有箭頭的。與之對應(yīng)的是 digraph ,表示 有向圖 ,連接線是有箭頭的。
而圖片的描述,是在 {} 里進(jìn)行,并且也支持注釋,注釋風(fēng)格與 C 語言類似,// 用于單行注釋, /**/ 用于多行注釋。
前文提到,dot 命令十分強(qiáng)大,這里只介紹它的最基本的一些用法,而學(xué)會這些最基本的命令,就可以應(yīng)對 80% 左右的工作。更多高級用法可以參考它的官網(wǎng)。
節(jié)點(diǎn)
類似于腳本語言,節(jié)點(diǎn)無需申明就可以直接使用。而對于節(jié)點(diǎn),我們一般設(shè)置它的以下幾個屬性:
- shape 形狀
- label 標(biāo)簽
- style 類型,填充還是非填充
- color 線條顏色
- fillcolor 填充顏色
這些屬性是在節(jié)點(diǎn)后的一對方括號 [] 里設(shè)置的。很多情況下,我們的節(jié)點(diǎn)屬性是完全相同的,那么我們可以定義一個 node ,并對它進(jìn)行設(shè)置,那么圖形里所有節(jié)點(diǎn)屬性都跟 node 一樣。如果某個節(jié)點(diǎn)想搞特殊,只需單獨(dú)對它進(jìn)行設(shè)置即可。
- graph g{
- node [shape = "box", style = "filled", color = "red", fillcolor = "green"] //設(shè)置節(jié)點(diǎn)的默認(rèn)形狀,類型,顏色,填充顏色
- a [shape = "ellipse", fillcolor = "yellow", label = "Hello"] //對某個節(jié)點(diǎn)進(jìn)行單獨(dú)設(shè)置
- b [label = "world"]
- a -- b
- a -- c //不對c進(jìn)行設(shè)置,使用默認(rèn)屬性
- d [shape = "circle",label = "cicle"] //d單獨(dú)設(shè)置屬性
- c -- d
- }

連接線
連接線依照有無箭頭分為有向邊和無向邊。它的常用屬性有如下:
- style 類型,實(shí)線還是虛線
- color 連接線顏色
- label 標(biāo)簽
- labelfontcolor 標(biāo)簽字體顏色
- headlabel 起始標(biāo)簽內(nèi)容
- taillabel 結(jié)束標(biāo)簽內(nèi)容
- decorate 標(biāo)簽與連接線之間有連線標(biāo)注
對于有向邊,還可以設(shè)置起點(diǎn)及終點(diǎn)的位置,用 e, s, w, n 表示 東南西北 ,也可以組合來表示,詳細(xì)請看下面實(shí)例。
和節(jié)點(diǎn)類似,連接線也可以設(shè)置默認(rèn)屬性,用 edge 表示。如果不使用默認(rèn)屬性的話,也可以自定義屬性。
- digraph edge_settings {
- edge [color = "green", decorate = false] //設(shè)置邊的默認(rèn)屬性
- node [shape = "polygon", sides = 4, color = "blue"]
- a -> b [style = "dotted", color = "red", label = "a to b"] //設(shè)置style、color、label
- b: se -> c: w [headlabel = "end", taillabel = "start"] //設(shè)置邊從b的“東南方”出發(fā),從c的“西方”結(jié)束,設(shè)置有向邊起點(diǎn)和終點(diǎn)的label
- {c, f} -> {d, e} [label = "multi-lines", decorate = true] //可以用這種方式同時(shí)畫多條邊
- }

圖
DOT語言可以描述無向圖和有向圖兩種圖,graph標(biāo)識無向圖,digraph標(biāo)識有向圖。對于圖的屬性設(shè)置,常用的有以下一些:
- size 尺寸
- label 標(biāo)簽
- labelloc 標(biāo)簽位置,通常設(shè)置為 t (頂),或 b (底)
- labeljust 標(biāo)簽對齊,比如左對齊、右對齊、居中,等等
- bgcolor 背景顏色
- rankdir 布局,比如從左往右,或者從上往下
圖里面還可以包含子圖,子圖必須以 cluster 作為前綴開始。比如官網(wǎng)首頁上的圖,即本文第一張圖,就是圖里包含子圖,它的源碼如下:
- digraph graph_settings {
- start [shape = "Mdiamond"]
- end [shape = "Msquare"]
- subgraph cluster_sub1 {
- label = "process #1"
- labelloc = "t"
- bgcolor = "gray55"
- node [style = "filled", color = "white"]
- a0 -> a1 -> a2 -> a3 -> a0
- }
- subgraph cluster_sub2 {
- label = "process #2"
- labelloc = "t"
- color = "blue"
- node [style = "filled", color = "black", fillcolor = "gray55"]
- b0 -> b1 -> b2 -> b3
- }
- start -> {a0, b0}
- a1 -> b3
- b2 -> a3
- {a3, b3} -> end
- }
小結(jié)
利用 dot 命令來繪圖,非常省事,也非常靈活,對于設(shè)計(jì)菜鳥而言,簡直不能太方便!它的功能十分強(qiáng)大,本文所介紹的只是它非常常用,但也是非常實(shí)用的一些基本功能,掌握這些功能就能應(yīng)對工作中絕大部分的場景。但想要做出更加炫酷的效果,還需要再細(xì)細(xì)研究它官網(wǎng)的資料。
本文授權(quán)轉(zhuǎn)載自公眾號「良許Linux」。良許,世界500強(qiáng)外企Linux開發(fā)工程師,公眾號里分享大量Linux干貨,歡迎關(guān)注!