天天看點

程式員輕松繪圖神器

轉載自公衆号「良許Linux」

我們程式員在工作生活中,有很多場合下需要繪制圖表,比如PPT裡的圖表,學習筆記的一些助記圖,還有最常見的,工作中大量使用的流程圖。

在 Window 下,我們有很多好用的工具,比如

Visio

EA

等等。這些軟體也很好用,但都有個缺點,那就是太複雜。我們需要一定的美工基礎,還要學很多軟體操作,才能畫出一張很簡單的流程圖。

而且,更要命的是,一旦需求發生變動,很不好修改,往往牽一發而動全身。是以經常在聽到需求變更的時候,良許就脊背一涼……

後來,在大神的介紹下,良許開始使用一個神器。這個神器不需要你懂美工,也不太需要懂軟體操作,繪圖的過程跟你寫軟體的過程差不多,短短的幾行代碼,就能把你頭腦裡的想法表現出來。

而且,不用擔心布局,不用擔心修改,甚至都不用滑鼠,也給制作出相當精美的作品!

這個神器就是:

dot

指令!

這個神器還有個圖形界面版,叫

Graphviz

,但良許習慣了指令行,一般是在指令行下完成的。

我們先來看下它能做什麼。以下幾個圖檔選自它的官網:

程式員輕松繪圖神器
程式員輕松繪圖神器
程式員輕松繪圖神器

這隻是其中的幾張圖而已,更多圖檔可以去它的官網檢視:

http://www.graphviz.org           

複制

這個軟體非常強大,如果掌握得好的話,可以畫出非常好看的作品,而且還不怕産品經理改需求。但是,在大多數情況下,我們不太需要用到它的進階功能,往往一些很基礎的功能就可以應付我們工作中的 80% 以上的需求了。

這個軟體的安裝很簡單,隻需執行以下指令即可:

sudo apt install graphviz           

複制

稍等一小會兒,就安裝成功了。然後,就可以愉快地玩耍啦~

我們先來看看一個 Hello world 水準的作品。

首先,在任意位置建立一個

test.dot

檔案(當然也可以叫其它名字),檔案的内容如下:

graph g{
     "Hello" -- "world"
}           

複制

然後,執行以下指令:

dot -Tpng -o test.png test.dot           

複制

之後,就在目前目錄下生成了下面這幅最簡單的圖檔了,是不是非常簡單?

程式員輕松繪圖神器

我們來簡單介紹下 DOT 指令的文法。在 test.dot 檔案裡,

graph

表示的是這幅圖是

無向圖

,也就是連接配接線是沒有箭頭的。與之對應的是

digraph

,表示

有向圖

,連接配接線是有箭頭的。

而圖檔的描述,是在

{}

裡進行,并且也支援注釋,注釋風格與 C 語言類似,

//

用于單行注釋,

/**/

用于多行注釋。

前文提到,dot 指令十分強大,這裡隻介紹它的最基本的一些用法,而學會這些最基本的指令,就可以應對 80% 左右的工作。更多進階用法可以參考它的官網。

節點

類似于腳本語言,節點無需申明就可以直接使用。而對于節點,我們一般設定它的以下幾個屬性:

  • shape 形狀
  • label 标簽
  • style 類型,填充還是非填充
  • color 線條顔色
  • fillcolor 填充顔色

這些屬性是在節點後的一對方括号

[]

裡設定的。很多情況下,我們的節點屬性是完全相同的,那麼我們可以定義一個

node

,并對它進行設定,那麼圖形裡所有節點屬性都跟 node 一樣。如果某個節點想搞特殊,隻需單獨對它進行設定即可。

graph g{
    node [shape = "box", style = "filled", color = "red", fillcolor = "green"]   //設定節點的預設形狀,類型,顔色,填充顔色
    a [shape = "ellipse", fillcolor = "yellow", label = "Hello"]    //對某個節點進行單獨設定
    b [label = "world"]   
    a -- b
    a -- c     //不對c進行設定,使用預設屬性
    d [shape = "circle",label = "cicle"]    //d單獨設定屬性
    c -- d
}           

複制

程式員輕松繪圖神器

連接配接線

連接配接線依照有無箭頭分為有向邊和無向邊。它的常用屬性有如下:

  • style 類型,實線還是虛線
  • color 連接配接線顔色
  • label 标簽
  • labelfontcolor 标簽字型顔色
  • headlabel 起始标簽内容
  • taillabel 結束标簽内容
  • decorate 标簽與連接配接線之間有連線标注

對于有向邊,還可以設定起點及終點的位置,用

e, s, w, n

表示

東南西北

,也可以組合來表示,詳細請看下面執行個體。

和節點類似,連接配接線也可以設定預設屬性,用

edge

表示。如果不使用預設屬性的話,也可以自定義屬性。

digraph edge_settings {
    edge [color = "green", decorate = false]        //設定邊的預設屬性
    node [shape = "polygon", sides = 4, color = "blue"]
    a -> b [style = "dotted", color = "red", label = "a to b"]  //設定style、color、label
    b: se -> c: w [headlabel = "end",  taillabel = "start"]     //設定邊從b的“東南方”出發,從c的“西方”結束,設定有向邊起點和終點的label
    {c, f} -> {d, e} [label = "multi-lines", decorate = true]    //可以用這種方式同時畫多條邊
}           

複制

程式員輕松繪圖神器

DOT語言可以描述無向圖和有向圖兩種圖,graph辨別無向圖,digraph辨別有向圖。對于圖的屬性設定,常用的有以下一些:

  • size 尺寸
  • label 标簽
  • labelloc 标簽位置,通常設定為 t (頂),或 b (底)
  • labeljust 标簽對齊,比如左對齊、右對齊、居中,等等
  • bgcolor 背景顔色
  • rankdir 布局,比如從左往右,或者從上往下

圖裡面還可以包含子圖,子圖必須以

cluster

作為字首開始。比如官網首頁上的圖,即本文第一張圖,就是圖裡包含子圖,它的源碼如下:

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
}           

複制

小結

利用 dot 指令來繪圖,非常省事,也非常靈活,對于設計菜鳥而言,簡直不能太友善!它的功能十分強大,本文所介紹的隻是它非常常用,但也是非常實用的一些基本功能,掌握這些功能就能應對工作中絕大部分的場景。但想要做出更加炫酷的效果,還需要再細細研究它官網的資料。