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屬性定義位置來修正這樣的問題。

參見

編輯

外部連結

編輯