天天看點

graphviz 安裝和入門

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/catoop/article/details/71429363

畫流程圖裝逼神器:graphviz,不解釋

———————————如下言歸正傳,切入正題———————————–

1、下載下傳

http://www.graphviz.org/Download_windows.php

下載下傳 graphviz-2.38.zip ,例如我解壓到位置 D:\Program Files\graphviz

2、配置環境變量

将 D:\Program Files\graphviz\release\bin 添加到環境變量 Path 中。

3、驗證

進入windows指令行界面,輸入dot -version,然後按回車,如果顯示graphviz的相關版本資訊,則安裝配置成功。

如下:

C:\Users\shanhy>dot -version
dot - graphviz version 2.38.0 (20140413.2041)
libdir = "D:\Program Files\graphviz\release\bin"
Activated plugin library: gvplugin_dot_layout.dll
Using layout: dot:dot_layout
Activated plugin library: gvplugin_core.dll
Using render: dot:core
Using device: dot:dot:core
The plugin configuration file:
        D:\Program Files\graphviz\release\bin\config6
                was successfully loaded.
    render      :  cairo dot fig gd gdiplus map pic pov ps svg tk vml vrml xdot
    layout      :  circo dot fdp neato nop nop1 nop2 osage patchwork sfdp twopi
    textlayout  :  textlayout
    device      :  bmp canon cmap cmapx cmapx_np dot emf emfplus eps fig gd gd2 gif gv imap imap_np ismap jpe jpeg jpg m
etafile pdf pic plain plain-ext png pov ps ps2 svg svgz tif tiff tk vml vmlz vrml wbmp xdot xdot1.2 xdot1.4
    loadimage   :  (lib) bmp eps gd gd2 gif jpe jpeg jpg png ps svg           

4、基本繪圖入門

運作 D:\Program Files\graphviz\release\bin 目錄下的 gvedit.exe 可以運作打開圖形界面。

File > New 建立新的腳本檔案,編寫腳本後,點選 “Layout”圖示(快捷鍵F5)可以直接檢視結果。

小試牛刀:

digraph gvDemo {
    main -> parse -> execute;
    main -> init;
    main -> cleanup;
    execute -> make_string;
    execute -> printf
    init -> make_string;
    main -> printf;
    execute -> compare;
}           

效果:

digraph gvDemo{
    node [peripheries=2 style=filled color="#eecc80"]
    edge [color="sienna" fontcolor="green"]
    main -> parse -> execute;
    main -> init [arrowhead = box];
    main -> cleanupi -> main;
    make_string[label = once shape=parallelogram style=filled ]
    execute -> make_string[label=Go style=dashed arrowtail=diamond];
    execute -> printf [shape=box];
    init -> make_string;
    main -> printf[dir=none];
    execute -> compare[dir=both];
}           

效果(這個不錯,可以當以後的模闆用 ^_^):

示例1:graph 使用 – 描述關系

graph gvDemo1 {
    a -- b
    a -- b
    b -- a [color=blue]
}           

效果:

示例2:digraph 使用 -> 描述關系

digraph gvDemo2 {
    a -> b
    a -> b
    b -> a [color=blue style=filled]
}           

示例3:

digraph gvDemo3 {
    edge[fontname="Microsoft YaHei"]
    node[fontname="Microsoft YaHei"]
    graph[fontname="Microsoft YaHei"]
    label="遊戲資源更新流程"
    rankdir="TB"
    start[label="啟動遊戲" shape=circle style=filled]
    ifwifi[label="網絡環境判斷是否 WIFI" shape=diamond]
    needupdate[label="是否有資源需要更新" shape=diamond]
    startslientdl[label="靜默下載下傳" shape=box]
    enterhall[label="進入遊戲大廳" shape=box]


    enterroom[label="進入房間" shape=box]
    resourceuptodate[label="資源不完整" shape=diamond]
    startplay[label="正常遊戲" shape=circle fillcolor=blue]
    warning[label="提醒玩家是否更新" shape=diamond]
    startdl[label="進入下載下傳界面" shape=box]
    //{rank=same; needupdate, enterhall}


    {shape=diamond; ifwifi, needupdate}


    start -> ifwifi
    ifwifi->needupdate[label="是"]
    ifwifi->enterhall[label="否"]
    needupdate->startslientdl[label="是"]
    startslientdl->enterhall
    needupdate->enterhall[label="否"]


    enterhall -> enterroom
    enterroom -> resourceuptodate
    resourceuptodate -> warning[label="是"]
    resourceuptodate -> startplay[label="否"]
    warning -> startdl[label="确認下載下傳"]
    warning -> enterhall[label="取消下載下傳"]
    startdl -> enterhall[label="取消下載下傳"]
    startdl -> startplay[label="下載下傳完成"]
}           

示例4:

graph gvDemo4{
    "黑海" -- "亞速海";
    "黑海" -- "博斯普魯斯海峽"
    "達達尼爾海峽" -- "愛琴海"
    subgraph cluster_T{//新東西
        label = "黑海海峽";//新東西
        "達達尼爾海峽" -- "馬爾馬拉海" -- "博斯普魯斯海峽";
    }
    subgraph cluster_M{
        label = "地中海海域";
        "中部地中海" -- {"愛琴海" "愛奧尼亞海" "西西裡海峽"}; //也是新東西
        "西部地中海" -- {"西西裡海峽" "第勒尼安海" "利古裡亞海" "伊比利海" "阿爾沃蘭海"};
        "愛奧尼亞海" -- "亞得裡亞海";
        "阿爾沃蘭海" -- "直布羅陀海峽";
    }
}            

這張圖有些新東西可以看。

第一個是subgraph 關鍵字。一如名字所示,他是用來定義「次級圖檔」用的。

次級圖檔在dot的官方檔案中常被叫作cluster subgraph,特指圖示中被方框包裹起來的那兩塊,其定義方式和一般的graph非常相似,不過使用上有兩件事需要留意:

graph的命名得以cluster字首開頭,否則文法雖然能過關,但生不出圖面上您預期的效果。

如果父圖是無向圖,他本身也得是無向圖;反之如果父圖是有向圖,這邊也得乖乖照着來。

第二個重點是下面這段:

“中部地中海” – {“愛琴海” “愛奧尼亞海” “西西裡海峽”};

用大括号括起,用空格分開-這是一口氣将好幾個節點群組起來同時操作的方法,其等效于:

“中部地中海” – “愛琴海”; 2 “中部地中海” – “愛奧尼亞海”; 3 “中部地中海” – “西西裡海峽”;

您甚至可以用以下程式碼畫出下面這個圖:

digraph gvABC {
    { a b c } -> { d e f }
}           

除了直接使用工具檢視和生成結果外,還可以使用指令來操作:

文法:
<cmd> <inputfile> -T <format> -o <outputfile>
示例:
dot D:\test\1.gv -Tpng -o image.png           

Graphviz 中的 cmd 有好多種,每種使用方法都完全相同,差别隻在于渲染出來的圖檔效果不一樣。

dot 渲染的圖具有明确方向性(最常用,一般都使用這個)。

neato 渲染的圖缺乏方向性。

twopi 渲染的圖采用放射性布局。

circo 渲染的圖采用環型布局。

fdp 渲染的圖缺乏方向性。

sfdp 渲染大型的圖,圖檔缺乏方向性。

PS:

Setting(快捷鍵Shift + F5) 裡面我們可以設定生成的檔案格式,例如可以生成 svg、pdf 等等格式,很強大。你可以參考工具裡面可以選擇的值帶入到指令行執行。

Graphviz 使用空格來解析腳本,是以我們在編寫腳本的時候,對于含有空格的字元,要使用雙引号,這樣才不會出現錯誤。

更多關于 dot 文法和graphviz 的使用詳見官方文檔:

http://www.graphviz.org/Documentation.php

關于中文亂碼問題的解決方法: 先将源檔案儲存為UTF-8格式,然後對中文内容設定 frontname,例如:

start[label="啟動遊戲" shape=circle style=filled, fontname="NSimSun"]

或者設定全局屬性,例如上面gvDemo3 中的代碼片段:

digraph gvDemo3 {
    edge[fontname="Microsoft YaHei"]
    node[fontname="Microsoft YaHei"]
    graph[fontname="Microsoft YaHei"]

}           

fontname後面也可以直接指定 xxx.ttf 字型檔案

Windows系統中文字型的英文名對應關系參考如下:

新細明體:PMingLiU

細明體:MingLiU

標楷體:DFKai-SB

黑體:SimHei

宋體:SimSun

新宋體:NSimSun

仿宋:FangSong

楷體:KaiTi

仿宋_GB2312:FangSong_GB2312

楷體_GB2312:KaiTi_GB2312

微軟正黑體:Microsoft JhengHei

微軟雅黑體:Microsoft YaHei

參考資料:

http://www.graphviz.org/Documentation/dotguide.pdf

(官方)

http://blog.jobbole.com/94472/

繼續閱讀