DOT語言
此條目沒有列出任何參考或來源。 (2019年2月21日) |
DOT語言是一種文字圖形描述語言。它提供了一種簡單的描述圖形的方法,並且可以為人類和電腦程式所理解。DOT語言檔案通常是具有.gv或是.dot的副檔名。
很多程式都可以處理DOT檔案。其中的一些,例如dot,neato,twopi,circo, fdp與sfdp,會讀取DOT檔案並將之彩現成為圖形格式。其它的一些,比如gvpr,gc,accyclic,ccomps,sccmap和tred,可以讀取DOT檔案並對它代表的圖形進行一些處理。類似於GVedit,lefty,dotty和grappa則提供了互動式的介面。以上程式大部分都包括在了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屬性定義位置來修正這樣的問題。