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)的位置有問題。