Graphviz(http://www.graphviz.org/)是一種命令行繪圖程式,能夠直接陳述圖片上的節點、邊、方向等性質,然後自動描繪出的整張圖片。本文將實際使用Graphviz並同時講解箇中的原理。
有向圖與無向圖
使用dot語言,第一步就是決定要畫哪種圖。圖分兩種:「有向圖」(圖2)與「無向圖」(圖3)。
|
▲圖2 有向圖。 |
|
▲圖3 無向圖。 |
有向圖以digraph宣告圖片,節點間的關係寫為"->"。
無向圖以graph宣告圖片,節點間的關係可以寫為"--"。
其中demo1與demo2是圖片的名稱,一般使用時常常留白不打。
使用引號
上文中的a、b、c除了作為程式內的識別字外,也會成為節點的顯示名稱(label)。不過如果這名稱中混了中文或夾了空格,Graphviz就有可能搞錯你的意思。
為防不必要的誤解,所以平常最好都用英文引號括住,就像下面這樣,結果如圖4所示:
|
▲圖4 混合了空白的示範,採用fdp渲染。 |
這樣就沒問題了!
子圖與簡化技巧
來看個複雜一點的例子,這是一份地中海海域的大略連接圖(圖5):
|
▲圖5 地中海海域連接圖,使用fdp渲染,種子為8 (-Gstart=8)。 |
這張圖有些新東西可以看。第一個是subgraph關鍵字。一如名字所示,是用來定義「次級圖片」用的。
次級圖片在dot的官方文件中常被叫作cluster subgraph,特指圖示中被方框包裹起來的那兩塊,其定義方式和一般的graph非常相似,不過使用上有兩件事需要留意:
它的命名得以cluster前綴開頭,否則語法雖然能過關,但無法產生圖面上預期的效果。
如果父圖是無向圖,它本身也得是無向圖;反之如果父圖是有向圖,這邊也得乖乖照著來。
第二個重點是下面這段:
用大括號括起,用空格分開——這是一口氣將好幾個節點群組起來同時操作的方法,其等效於:
甚至可以用以下程式碼畫出圖6:
|
▲圖6 大括號效果示意圖。 |
這語法很方便,可以靈活運用。
第三個不同處在於label = XXX這行。這是「屬性」的指定方式。