DOT語言是一種文字圖形描述語言。它提供了一種簡單的描述圖形的方法,並且可以為人類和電腦程式所理解。DOT語言檔案通常是具有.gv或是.dot副檔名

很多程式都可以處理DOT檔案。其中的一些,例如dotneatotwopicirco, fdpsfdp,會讀取DOT檔案並將之渲染成為圖形格式。其它的一些,比如gvprgcaccyclicccompssccmaptred,可以讀取DOT檔案並對它代表的圖形進行一些處理。類似於GVeditleftydottygrappa則提供了互動式的介面。以上程式大部分都包括在了Graphviz軟件套件中。

語法

圖形類別

無向圖

 
一張無向圖

在最簡單的應用中,DOT語言可以用來描述一張無向圖。無向圖顯示了對象間最簡單的關係,例如人之間的友誼。使用關鍵字graph開始一張無向圖的定義,並用大括號包含要描述的節點,雙連字號(--)被用來描述節點間的關係。另外,一行的末尾需要加上分號(;)。

  graph graphname {
     a -- b -- c;
     b -- d;
 }

有向圖

 
一張有向圖

類似於無向圖,DOT語言也可以用來描述一張有向圖,類似於流程圖樹狀圖。其語法與無向圖相似,但要在圖的最開始使用關鍵字'digraph',並用箭頭(->)表示節點直接的關係。

 digraph graphname {
    a -> b -> c;
    b -> d;
}

屬性

 
一張有屬性的圖

DOT語言中,可以對節點和邊添加不同的屬性。這些屬性可以控制節點和邊的顯示樣式,例如顏色,形狀和線形。可以在陳述式和句尾的分號間放置一對方括號,並在其中中放置一個或多個屬性-值對。多個屬性可以被逗號和空格(, )分開。節點的屬性被放置在只包含節點名稱的表達式後。

 graph graphname {
     // label属性可以改变节点的显示名称
     a [label="Foo"];
     // 节点形状被改变了
     b [shape=box];
     // a-b边和b-c边有相同的属性
     a -- b -- c [color=blue];
     b -- d [style=dotted];
 }

註釋

DOT語言支援C語言C++風格的單行與多行註釋。另外,也支援Shell指令碼風格的以#開頭的註釋。

 // 单行注释
 /* 多行

    释 */
 # 如此的行也会被忽略。

一個簡單的例子

以下是一個描述了乙烷化學鍵結構的範例指令碼。這是一個無向圖,包括了上述解釋的節點屬性。

 graph ethane {
     C_0 -- H_0 [type=s];
     C_0 -- H_1 [type=s];
     C_0 -- H_2 [type=s];
     C_0 -- C_1 [type=s];
     C_1 -- H_3 [type=s];
     C_1 -- H_4 [type=s];
     C_1 -- H_5 [type=s];
 }

支援的程式

DOT語言定義了圖,但沒有提供渲染圖的工具。這裏列出了一些可以用來渲染,檢視與修改DOT圖的程式:

  • Graphviz - 一組用來修改和渲染圖的軟件庫和程式。
  • OmniGraffle 可以匯入DOT語言的一個子集,生成一個可編輯的文件,但轉換結果不能被匯出成為DOT檔案。

限制

 
一張被不當渲染的圖片

可以用DOT定義圖形的位置細節,雖然不是所有實現了DOT語言的工具都可以適當的處理位置屬性。因此,取決於所使用的工具,用戶必須依賴於自動佈局演算法(可能造成非預期的輸出)或者繁瑣的手工佈局節點屬性。

例如:

digraph g {
	node [shape=plaintext]
	A1 -> B1
	A2 -> B2
	A3 -> B3
	
	A1 -> A2 [label=f]
	A2 -> A3 [label=g]
	B2 -> B3 [label="g'"]
	B1 -> B3 [label="(g o f)'" tailport=s headport=s]

	{ rank=same; A1 A2 A3 }
	{ rank=same; B1 B2 B3 } 
}
 
在移動了標籤和箭頭並改變子指令碼的字型大小之後,圖形變得正常了

上圖有兩個問題。右邊的方形不是完美的正方形,而且標籤(g o f)的位置有問題。

這些問題可以用Inkscape或其它的SVG編輯器修正。在某些情況下,也可以利用pos屬性定義位置來修正這樣的問題。

參見

外部連結