一、簡介DOT & graphviz
1. DOT
DOT是一種文本圖形描述語言。DOT語言文件通常具有.gv或是.dot的文件擴展名。當然,在編寫好.dot或者.gv的文件之后,需要有專門的程序處理這些文件並將其渲染成為圖片,dot就是其中一款程序,它可以將DOT語言描述的圖形渲染成.png、.jpg、.pdf等多種類型。
當然,作為工具,dot本身是很原始的,就像gcc之於c代碼,g++之於cpp代碼一樣,或許某些程序員會熱衷於在終端使用這些工具,但也有很多人喜歡交互式的界面,所以就有了gvedit之類的工具,它提供交互式的窗口來使用dot等工具渲染DOT語言描述的圖形。
2. graphviz
graphviz是一個開源軟件包,上述dot和gvedit等工具都在該軟件包中。
所以,不妨簡單的認為DOT是一門圖形描述語言而graphviz是處理該語言文件的一個集成化的工具。
二、使用DOT & graphviz
1. 環境配置(ubuntu)
sudo apt-get install graphviz
2. 應用實例
創建test.dot文件內容如下:
digraph g {
node [shape=plaintext]
A1 -> B1
A2 -> B2
A1 -> A2
B1 -> B2
}
在終端直接調用dot命令處理文本並生成圖片。以把test.dot導出為test.png為例,命令為:dot -Tpng -o test.png test.dot
三、DOT語法
現在已經可以愉快的使用DOT & graphviz繪圖了,唯一需要的就是更好的了解DOT語法,以繪出我們期望的效果。
DOT語法相對簡單和松散,沒有特別的格式要求,也沒有復雜的運算符和結構。
1. 基本語法
graph(無向圖)或者digraph(無向圖)表示圖,然后{}中的內容是對圖的描述,注釋風格和C類似(“//”用於單行注釋,/**/用於多行注釋)。如一個無向圖:
- graph graph1 { //無向圖graph1
- a -- b //節點a和b之間連線
- }
2. 節點
DOT中,節點可以不用聲明直接使用。每個節點首次出現的名稱做為該節點的唯一標識。
屬性設置:對節點可以設置的常見通用屬性有shape、label、style、color、fillcolor、rank等,對於不同的形狀,可能還有不同的屬性可以設置,如對於多邊形可以設置邊數等。節點屬性設置時,node用於設置默認屬性(對設置位置之后的點有效),在點后面用[]設置單獨一個點的屬性。
- graph node_settings {
- node [shape = "box", style = "filled", color = "black", fillcolor = "green"] //設置節點的默認形狀,類型,顏色,填充顏色
- a [shape = "ellipse", color = "red", label = "this is a"] //設置節點a的顏色,注意默認節點類型是filled,所以這里的color只是設置a的邊框顏色
- b [label = "two\nlines"] //label支持'\n'換行
- a -- b
- a -- c //如果不需要設置c的屬性,可以不用聲明c而直接使用
- node [shape = "circle"]
- d [label = "cicle"]
- c -- d //d使用之前最后出現的node設置,形狀為circle
- {rank = same a, d} //設置a和d在同一層
- }
3. 邊
邊有有向邊和無向邊兩種,無向邊用於無向圖,有向邊用於有向圖,不可混用。
屬性設置:邊的常見設置有style、color、weight、label、labelfontcolor、headlabel、taillabel、decorate等,對於有向邊,還可以設置邊的起點位置等(用n、e、s、w和相鄰字母的組合表示位置)。和節點類似的,邊屬性設置時,用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
- edge [style = "bond", decorate = true] //設置之后的邊加粗並且標簽和連線之間有線標注
- {c, f} -> {d, e} [label = "multi-lines"] //可以用這種方式同時畫多條邊
- }
4. 圖
從前面的例子中已經可以看出,DOT語言可以描述無向圖和有向圖兩種圖,graph標識無向圖,digraph標識有向圖。
屬性設置:在一個圖的開頭寫入屬性即可設置圖形的屬性,常用的圖形屬性有size、label、labelloc、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
- }
本文參考:http://blog.csdn.net/stormdpzh/article/details/14648827
三、DOT語法
現在已經可以愉快的使用DOT & graphviz繪圖了,唯一需要的就是更好的了解DOT語法,以繪出我們期望的效果。
DOT語法相對簡單和松散,沒有特別的格式要求,也沒有復雜的運算符和結構。
1. 基本語法
graph(無向圖)或者digraph(無向圖)表示圖,然后{}中的內容是對圖的描述,注釋風格和C類似(“//”用於單行注釋,/**/用於多行注釋)。如一個無向圖:
- graph graph1 { //無向圖graph1
- a -- b //節點a和b之間連線
- }
2. 節點
DOT中,節點可以不用聲明直接使用。每個節點首次出現的名稱做為該節點的唯一標識。
屬性設置:對節點可以設置的常見通用屬性有shape、label、style、color、fillcolor、rank等,對於不同的形狀,可能還有不同的屬性可以設置,如對於多邊形可以設置邊數等。節點屬性設置時,node用於設置默認屬性(對設置位置之后的點有效),在點后面用[]設置單獨一個點的屬性。
- graph node_settings {
- node [shape = "box", style = "filled", color = "black", fillcolor = "green"] //設置節點的默認形狀,類型,顏色,填充顏色
- a [shape = "ellipse", color = "red", label = "this is a"] //設置節點a的顏色,注意默認節點類型是filled,所以這里的color只是設置a的邊框顏色
- b [label = "two\nlines"] //label支持'\n'換行
- a -- b
- a -- c //如果不需要設置c的屬性,可以不用聲明c而直接使用
- node [shape = "circle"]
- d [label = "cicle"]
- c -- d //d使用之前最后出現的node設置,形狀為circle
- {rank = same a, d} //設置a和d在同一層
- }
3. 邊
邊有有向邊和無向邊兩種,無向邊用於無向圖,有向邊用於有向圖,不可混用。
屬性設置:邊的常見設置有style、color、weight、label、labelfontcolor、headlabel、taillabel、decorate等,對於有向邊,還可以設置邊的起點位置等(用n、e、s、w和相鄰字母的組合表示位置)。和節點類似的,邊屬性設置時,用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
- edge [style = "bond", decorate = true] //設置之后的邊加粗並且標簽和連線之間有線標注
- {c, f} -> {d, e} [label = "multi-lines"] //可以用這種方式同時畫多條邊
- }
4. 圖
從前面的例子中已經可以看出,DOT語言可以描述無向圖和有向圖兩種圖,graph標識無向圖,digraph標識有向圖。
屬性設置:在一個圖的開頭寫入屬性即可設置圖形的屬性,常用的圖形屬性有size、label、labelloc、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
- }