程序員輕鬆繪圖神器

咱們程序員在工做生活中,有不少場合下須要繪製圖表,好比PPT裏的圖表,學習筆記的一些助記圖,還有最多見的,工做中大量使用的流程圖。node

在 Window 下,咱們有不少好用的工具,好比 VisioEA 等等。這些軟件也很好用,但都有個缺點,那就是太複雜。咱們須要必定的美工基礎,還要學不少軟件操做,才能畫出一張很簡單的流程圖。程序員

並且,更要命的是,一旦需求發生變更,很很差修改,每每牽一髮而動全身。因此常常在聽到需求變動的時候,良許就脊背一涼……ide

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

並且,不用擔憂佈局,不用擔憂修改,甚至都不用鼠標,也給製做出至關精美的做品!佈局

這個神器就是:dot 命令!學習

這個神器還有個圖形界面版,叫 Graphviz ,但良許習慣了命令行,通常是在命令行下完成的。字體

咱們先來看下它能作什麼。如下幾個圖片選自它的官網:命令行

這只是其中的幾張圖而已,更多圖片能夠去它的官網查看:設計

http://www.graphviz.org

這個軟件很是強大,若是掌握得好的話,能夠畫出很是好看的做品,並且還不怕產品經理改需求。可是,在大多數狀況下,咱們不太須要用到它的高級功能,每每一些很基礎的功能就能夠應付咱們工做中的 80% 以上的需求了。3d

這個軟件的安裝很簡單,只需執行如下命令便可:

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 命令來繪圖,很是省事,也很是靈活,對於設計菜鳥而言,簡直不能太方便!它的功能十分強大,本文所介紹的只是它很是經常使用,但也是很是實用的一些基本功能,掌握這些功能就能應對工做中絕大部分的場景。但想要作出更加炫酷的效果,還須要再細細研究它官網的資料。


公衆號:良許Linux

有收穫?但願老鐵們來個三連擊,給更多的人看到這篇文章

相關文章
相關標籤/搜索