2012年6月10日 星期日

Graphviz

Graphviz

介紹

Graphviz是一套open source的圖形視覺化軟體,
簡單的來說我們可以用文字描述nodes之間的關係,就可以將圖畫出來。

安裝

Graphviz官網的Download頁面就可以下載到各作業系統的版本,
包含Linux, Solaris, Windows, Mac。
如果是Linux的話也可以直接從套件庫安裝,以Ubuntu/Debian為例的話
sudo apt-get install graphviz

語法

Graphviz是是使用一種稱作dot語言的圖形描述語言來描述圖形,
而在Graphviz中又分為無向圖和有向圖,底下各舉一個範例。
  • 無向圖
graph G
{
        A -- B;
}
上面的code可以畫出下面這張圖
https://github.com/float-tw/float-blog/raw/master/img/undirected_graph.jpg
  • 有向圖
digraph G
{
        A -> B;
}
這段則可以畫出下面這張
https://github.com/float-tw/float-blog/raw/master/img/directed_graph.jpg
有向圖和無向圖的差異主要有兩個地方,第一個是宣告圖形的關鍵字,
無向圖是graph,有向圖是digraph,另一個是圖形連接用的符號,
無向圖是用--,有向圖是用->

編譯方式

Graphviz包含了dot, neato, circo, twopi, fdp, dotty, lefty等工具,
其中dot, neato, circo, twopi, fdp都是產生圖形的工具,差異是產的圖形的方式不同,
dotty,lefty則是圖形化的修改工具。
以dot來舉例,假設輸入檔案為input.dot,希望輸出jpg格式的檔案,命名為output.jpg,
可以用下面兩種方式:
dot -T jpg input.dot -o output.jpg
or
dot -T jpg input.dot > output.jpg

形狀和排列

有時候輸出的圖形可能和我們想像的不一樣,像是
digraph G
{
        a -> b;
        a -> c;
}
https://github.com/float-tw/float-blog/raw/master/img/graphviz_ex1.jpg
如果希望a和b可以擺在相同高度,那可以這樣修改
digraph G
{
        a -> b;
        a -> c;
        {rank=same; a; b;}
}
https://github.com/float-tw/float-blog/raw/master/img/graphviz_ex2.jpg
另外,node和arrow等等的形狀、顏色都是可以修改的在document裡面可以找到很多範例
下面隨便舉個例子(從node-shape的範例修改)
digraph G
{
        rankdir=LR
        node [shape=box, color=blue]
        node1 [style=filled]
        node2 [style=filled, fillcolor=red]
        node0 -> node1;
        node1-> node2[arrowhead=vee];
}
https://github.com/float-tw/float-blog/raw/master/img/graphviz_ex3.jpg