Graphviz全称Graph Visualization Software,是一款开源的可视化图形軟件,具有网络和交互图形界面,包含几个主要的图形布局计划,主要用于绘制DOT语言脚本描述的图形。

Graphviz安裝教程
雙擊msi文件,然後一直next(記住安裝路徑,後面配置環境變量會用到路徑信息),安裝完成之後,會在windows開始菜單創建快捷信息,默認快捷方式不放在桌面。
配置環境變量
將graphviz安裝目錄下的bin文件夾添加到Path環境變量中:

驗證
进入windows命令行界面,输入dot -version,然后按回车,如果显示graphviz的相关版本信息,则安装配置成功。
Graphviz使用說明
(一)、總的架構
今天我們講一下Graphviz的概述,從前一章我們明白,Graphviz不只是一個解釋器那麽簡單,它還包含著包括C接口在內的諸多接口,事實上,Graphviz可以根據用戶的需求,在運行的各個環節進行定制和嵌入,下面這張概念圖,是我對Graphviz機制的了解:
在這裏,我們會一一解釋,並且討論幾個關鍵的地方:C接口、布局計算與渲染。
首先看一看輸入,Graphviz的輸入包括三個:腳本輸入(DOT)、編程語言輸入(C語言、Python語言甚至是Java語言、PHP)、圖形界面輸入。事實上,無論是那一種輸入,到最後都會調用C接口輸入。
然後就是C語言接口,也就是我們上一章所說的C語言接口的例子,著一個環節主要將輸入變成Graphviz可以識別的內部格式,也就是用于描述圖的數據結構,包括Agraph_t、Agnode_t、Agedge等等。
産生內部格式後,程序應該交給Graphviz預定義的布局引擎進行計算,這個過程將會計算出圖的各個元素的集合信息,例如節點的位置、大小、形狀;邊的形狀(Graphviz使用貝塞爾曲線顯示邊)等等。同時,用戶還可以自己定制自己的布局引擎。
下一步就是將內部格式轉換爲可以被用戶所了解的格式,也就是渲染環節,這一環節使用的機制稱爲渲染引擎,經過渲染,可以將信息轉換爲DOT格式(就是腳本,可以用于存儲、調試)、圖片(有很多、我就不說了)。用戶也可以定制自己的渲染引擎,以生成其它格式,或者向用戶程序生成圖像。
在Graphviz的C接口,也就是GVC中,封裝了其中的三個模塊:數據結構以及操作、布局引擎、渲染引擎。每一個模塊都可以單獨使用,使之嵌入到應用程序之中,並且布局引擎以及渲染引擎可以由用戶定制,執行用戶自己指定的行爲。例如,我們將使用布局引擎嵌入至應用程序之中,應用程序可以使用布局引擎的計算結果,去指導應用程序的繪圖;可以定制自己的渲染模塊,使輸出格式更爲多樣。
(二)、關于數據結構
1. 在gvc(Graphviz的C语言封装)中、最重要的数据结构莫过于这三个:Agraph_t、Agnode_t、Agedge_t。这三个数据分别代表图(子图)、节点、边。gvc中所有操作可以说是围绕这三个元素进行的,也可以分为两类:结构操作、属性操作。
通過結構操作,用戶可以完成對圖的結構的構建,如agedge(graph,node1,node2,name,flag),會生成一個圖graph中的邊,邊的兩端爲node1與node2,標識(不是label)爲name。這些操作都可以導致圖結構的變動。
通過屬性操作,用戶可以完成對圖中元素屬性的改動,Graphviz提供了大量的屬性,用戶甚至可以定義自己的屬性,因此具有良好的自由度和重用性。值得一提的是,Graphviz的屬性只接受字符串形式,也就是說,我們提取和指定屬性時,即使屬性是數值型或其他不是字符串的類型,也要轉換爲字符串,Graphviz會通過內部的轉換機制,將字符串轉換爲相應的類型;同時,屬性必需先初始化,再提取和指定,沒有初始化的情況下,Graphviz會使用內部預定義的默認值,比如字體的顔色屬性fontcolor默認是黑色、字體名稱fontname默認時Times-Roman、字體大小fontsize默認時14。
2.經過布局計算,計算結果將會儲存至數據結構自身的其他字段當中之中,由于Graphviz向用戶隱藏了數據結構的具體細節,用戶只能通過特定的接口,而不是直接通過結構的定義,去訪問布局計算的結果;訪問計算結果的接口定義在頭文件include/graphviz/types.h中,形式爲ElemType_ResultField(ElemHandle),ElemType_爲元素的類型前綴,圖的前綴爲GD_,節點的前綴爲ND_,邊的前綴爲ED_;如果我要訪問某一個節點的形狀,可以使用宏ND_shape(instance)->name,類型爲char*。
3.關于內存問題,以下幾個部分的內存,是需要程序員自己管理的,以防止內存溢出:一是GVC的句柄GVC_t,再GVC使用之前要使用gvContext()産生,再使用完畢後要使用gvFreeContext(gv)進行回收;二是,數據結構,例如圖Agraph_t,使用完畢後也要使用agclose(g),來回收,只要不是頂層的元素,例如子圖、節點、邊、屬性句柄,他們在創建的時候就已經被頂層數據結構所標記,因此回收時不需要顯式的回收,因爲頂層回收時會自動回收,但是,如果中途就不使用這一個元素了,就要顯式的回收,例如Agnode_t使用agdelnode回收;三是,布局結果需要顯式回收,一般使用gvFreeLayout(gv,g)進行回收。
(三)、關于腳本語言
再Graphviz之中,使用的最多的莫過于腳本語言,相比C接口,腳本語言跟加便捷易懂,也不需要使用太多的精力去學習。一般說,C接口主要用于對Graphviz進行擴展以及嵌入到一些應用程序之中。
可以使用dot程序生成帶有漢字信息的圖片,需要注意兩點,否則生成的圖片中漢字會被顯示爲亂碼:一是文件應該使用UTF-8編碼保存(再Windows的要注意了,不是默認的ANSI編碼);二是、字體應該指定爲支持漢字的字體,如宋體SimSun,一般最好使用一些大多數平台共用的字體例如Times字體。
Graphviz的幾個例子
1、Fancy graph
從上面的代碼可以看出,dot語言非常簡單,就是一個純描述性的語言而已。
大家可以把上面的代碼和下圖中的連接對應起來看。
2、Polygon graph
下面是對應的圖片:
3、連接點的方向
我们可以用“n”,”ne”,”e”,””se”, “sw”,”w”,”nw”,
分别表示冲哪一个方向连接这个节点(图形)-“north, northeast……”如:
4、數據結構圖
數據結構圖是我們很容易用到的一類圖形,一個簡單地數據結構圖代碼如下:
