在很多演算法中都需要用到圖(Graph)這種資料結構,但圖的電腦實現相對複雜,調試時往往無法直觀的看出結果是否符合要求。圖的可視化(Visualization)技術可以解決這個問題。這種技術可以將圖的邏輯結構形象的在2維平面上表示出來,以進行直觀的示範。比如這個demo可以形象的表達二叉排序樹的插入過程。可能更重要的是,通過觀察圖的可視化結果,我們可以得到一些有意義的結論,從而指導進一步的工作和研究。比如下面的圖(來源)是一個大程式的模組調用圖。它可以直觀的表示模組之間的依賴關係,從而為高效測試提供依據。這篇文將會簡單介紹(Windows平台下)幾種常用的GraphVisualization工具。
圖1 Graph Visualization結果樣本
NodeXL
NodeXL(Network Overview, Discovery and Exploration for eXceL)是一個微軟的開源Graph Visualization工具。如同其他微軟的優秀產品一樣,學習前期上手非常快,後期又提供豐富的功能和靈活的定製性。
圖2 NodeXL可視化結果樣本(來源)
NodeXL的使用非常簡單。它是作為一個Excel模板安裝的。安裝完成後開啟Excel,根據NodeXLGraph建立一個xls文檔就可以使用了。在Vertex工作表中填入頂點的相關資訊,Edge工作表中填入邊的相關資訊,單擊側邊欄中的Show Graph,一切就搞定了。各種基本操作非常直觀,自動布局演算法的改動,頂點的手動拖動,縮放在GUI中都可以輕鬆完成。而頂點和邊的各種屬性也可以在xls表格中更改。
其中比較亮點的功能是可以用圖片作為圖的頂點。這就帶來了很大的靈活性。比如是對The Big Bang Theory某一集構建的人物關係圖,邊的粗細代表人物關係的密切程度。對於很密切的關係,邊被著成紅色。
圖3 TBBT某一集的人物關係圖
此外,Excel這個平台為使用者集中精力在分析資料本身上提供了很大方便。點點滑鼠我們就可以方便的對資料進行批量處理:排序,過濾,繪製各種圖表,而不用考慮如何編寫代碼,如何處理GUI事件。值得一提的是,NodeXL還支援多種輸入格式,除了簡單的複製粘貼外,還可以直接匯入流行的UCINET, GraphML的格式檔案,或者最簡單的鄰接矩陣等。它甚至還提供了自動收集twitter,flickr上的資料並繪製圖表的操作選項。
當然,NodeXL還提供了高度的可程式化性。在.NET中我們可以方便的調用它在Excel中體現的全部功能。事實上,Excel的模板只是它的一個wrapper而已。
Graphviz
看完了華麗的介面,強大的GUI,與Office無縫整合,.NET支援等一些列充滿微軟色彩的NodeXL,下面就是來自開源界且同樣強大的Graphviz。Graphviz是典型的*nix編程思想的結晶,與NodeXL相比恰如LaTeX與Word般特色鮮明。命令列,stdin輸入stdout輸出,自己建立了一套描述圖的語言,跨平台,方便擷取的源碼。它的每一個特性都彰顯著*nix的優雅和強大。
因為是命令列工具用文本進行輸入,因此可以方便的被各種平台叫用。.NET, C/C++, Java, MATLAB… 不用考慮wrapper或者P/Invoke。而它用來描述圖的語言同樣簡潔強大。比如這樣的代碼就會編譯產生所示的圖:graph g { a −− b −− c; }
圖4 Graphviz輸出樣本
各個頂點和邊的屬性同樣可以用語言指定。唯一比較遺憾的是似乎只支援eps格式的圖片做頂點。作為從Windows平台出來的人,我也不曉得一般的圖片能不能轉成eps,怎麼轉。還希望各位指教。(經過Milo Yip的指點,發現可以用一般圖片做頂點,在此表示感謝!)
其他
此外,比較有名的和圖相關的庫還有GLEE, Quick Graph和UbiGraph。GLEE是MicrosoftResearch做的一個自動布局圖(AutomaticGraph Layout)的庫,NodeXL中就使用了它。Quick Graph是一個圖的演算法庫,更偏重於圖的相關演算法。UbiGraph是一個非常強大的GraphVisualization的庫,文章開頭的二叉排序樹的demo就來自於它,但由於不支援Windows而且似乎需要設定管理員所以就沒能試用了。
這篇文主要介紹了Graph Visualization是什麼,有什麼用,以及可以調那些庫來實現。感覺Graph Visualization還是一個很有意思的東西,把一些資料視覺效果一下說不定就會有一些有意義的發現。