Graphviz使用簡介
graphviz是基於dot語言的繪圖工具,可以畫有向圖、無向圖、關系圖、目錄圖、流程圖等。具體作用可見它的官方網站
一些參考的網址:
http://www.open-open.com/lib/view/open1455954987933.html
https://www.oschina.net/question/129540_79958
http://blog.csdn.net/xiajian2010/article/details/23748557
如果想更進一步,直接上官網:http://www.graphviz.org/Documentation.php
dot draws directed graphs as hierarchies. It runs as a command line program,
web visualization service, or with a compatible graphical interface.
Its features include well-tuned layout algorithms for placing nodes and edge
splines, edge labels, “record” shapes with “ports” for drawing data structures;
cluster layouts; and an underlying file language for stream-oriented
graph tools.
正如上面所提到的,Graphviz是門基於dot語言的繪圖工具,也就是說它不是使用鼠標來畫圖的,而是通過dot這種描述語言來做的,然后在命令行下使用命令生成對應的圖片,這樣做的優點是不用去手功的對齊坐標,而且也可以做為一些可視化的解決方案,但是它的缺點同樣是顯著的:無法對每一個元素的位置進行很詳細的控制。這里就存在一個取舍問題了。像我這種就用來畫畫流程圖的人來說,已經夠用了,而且要比visio那種工具更好用。
DOT語言由三個對象組成grahps,nodes,edges,這與離散數學中的圖的定義是一個概念。下面是個具體的例子,第一行是圖名與類型,其於的就是創建nodes,edges,或者subgraphs。在要創建的這些對象中,它們的名字與屬性可以是 C identifiers,數字,或者是quoted C string, 引號的作用主要是為了在名字與屬性中可以帶空白符與標點符號。
例子:
在命令行使用如下命令
dot -Tpng example.dot -o example.png
-T的意思是生成的文件是png格式的,example.dot是代碼所在文件,-o指定生成的文件名。運行成功后將會類似如下的圖。
digraph G{ edge [fontname="NSimSun"]; node [ fontname="NSimSun" size="15,15"]; { main -> parse -> execute; main -> init; main -> cleanup; execute -> make_string; execute -> printf; init -> make_string; main -> printf; execute -> compare; } }
顯示圖形:
node將在它第一次出現時建立,當多個node使用操作符”->”來聯接時,邊將自動被創建。
如果想讓邊帶有文字,如下圖,可以使用類似如下語句
main->parse[label=”abc”];
下面是一個比較復雜的例子:
digraph G { edge [fontname="FangSong"]; node [shape=box, fontname="FangSong" size="20,20"]; { Lexical_Analyzer [label="詞法分析器"]; Syntax_Analyzer [label="語法分析器" ]; Semantic_Analyzer [label="語義分析" ]; Intermediate_Code_Generator [label="中間代碼生成器" ]; Machine_Independent_Code_Optimizer [label="機器無關代碼優化器" ]; Code_Generator [label="代碼生成器" ]; Machine_Dependent_Code_Optimizer [label="機器相關代碼優化器" ]; } node[shape=plaintext, fontname="KaiTi" ]{ character_stream [label="字符流"]; target_machine_code [label="目標機器語言" ]; }character_stream ->Lexical_Analyzer; Lexical_Analyzer ->Syntax_Analyzer [label="符號流"]; Syntax_Analyzer ->Semantic_Analyzer [label="語法樹"]; Semantic_Analyzer ->Intermediate_Code_Generator [label="語法樹"] ; Intermediate_Code_Generator->Machine_Independent_Code_Optimizer [label="中間表示形式"]; Machine_Independent_Code_Optimizer ->Code_Generator [label="中間表示形式"]; Code_Generator ->Machine_Dependent_Code_Optimizer [label="目標機器語言"]; Machine_Dependent_Code_Optimizer->target_machine_code ; }
一個簡單的例子:
digraph directed { edge [fontname="FangSong"]; { a -> b; a -> c -> d [color=red,penwidth=3.0]; c -> e[label="葉子"]; } }
這里要注意的是中文問題,graphviz默認設置下是不支持中文,如果在dot文件中直接寫中文,會顯示成亂碼,要解決這個問題要做兩件事,
1、把源文件保存為UTF-8的格式
2、設置fontname,也就是紅色的部分,
如果想更深入的了解graphviz,可以去它的官方網站看一下相關文檔,里面還有一些paper,如果感興趣的話也可以看看,其實graphviz還用到了編譯原理的知識,只是沒有什么創新所以也就沒有重點說了,但從這可見編譯原理的重要性。
附
1、windows系統中文字體的英文名
新細明體:PMingLiU
細明體:MingLiU
標楷體:DFKai-SB
黑體:SimHei
宋體:SimSun
新宋體:NSimSun
仿宋:FangSong
楷體:KaiTi
仿宋_GB2312:FangSong_GB2312
楷體_GB2312:KaiTi_GB2312
微軟正黑體:Microsoft JhengHei
微軟雅黑體:Microsoft YaHei



