数据可视化(三)基于 Graphviz 实现程序化绘图
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
前言
我之前在幾篇文章新一代Ntopng網(wǎng)絡(luò)流量監(jiān)控—可視化和架構(gòu)分析、 數(shù)據(jù)可視化(一)思維利器 OmniGraffle 繪圖指南 |201601,都曾提到了力導(dǎo)圖,在關(guān)于 OmniGraffle 的文章結(jié)尾還吐槽了一番自動(dòng)布局按鈕的坑。在本文中我力求將這個(gè)坑填上。
OmniGraffle 生成自動(dòng)布局圖形的基礎(chǔ)是 Graphviz 引擎。Graphviz(Graph Visualization Software)是一個(gè)由AT&T實(shí)驗(yàn)室啟動(dòng)的開(kāi)源工具包,能夠支持基于 DOT 腳本,文件擴(kuò)展名通常是 .gv 或 .dot 的描述繪制圖形。DOT 是一種文本圖形描述語(yǔ)言,將生成的圖形轉(zhuǎn)換成多種輸出格式的命令行工具,其輸出格式包括PostScript,PDF,SVG,PNG,含注解的文本等。DOT 本身非常原始,提供了一種非常簡(jiǎn)單的描述圖形的方法,同時(shí)意味著可以在命令行終端使用,或者被其它編程語(yǔ)言調(diào)用(Graphviz 就可以作為一個(gè)庫(kù)使用)。這一點(diǎn)非常關(guān)鍵,基于 Graphviz 應(yīng)用開(kāi)發(fā)者不必掌握布局的復(fù)雜算法,而是可以把精力放在業(yè)務(wù)方面,將最后的圖對(duì)象交給繪圖引擎來(lái)處理即可。
有趣的是 Graphviz(Mac 版) 和 OmniGraffle 都曾獲得蘋果設(shè)計(jì)獎(jiǎng) Apple Design Awards。
在深入掌握 Graphviz 及其相關(guān)衍生應(yīng)用之前,我們有必要了解一些基礎(chǔ)理論 —— 圖論(Graph theory)。
一、背景知識(shí):圖論(Graph theory)
- 柯尼斯堡七橋問(wèn)題
東普魯士柯尼斯堡(今日俄羅斯加里寧格勒)市區(qū)跨普列戈利亞河兩岸,河中心有兩個(gè)小島。小島與河的兩岸有七條橋連接。在所有橋都只能走一遍的前提下,如何才能把這個(gè)地方所有的橋都走遍?
許多數(shù)學(xué)家都嘗試去尋找這類問(wèn)題的解決方案,后來(lái)發(fā)展成為了數(shù)學(xué)中的圖論。圖論史上第一篇重要文獻(xiàn)是萊昂哈德·歐拉在1736年發(fā)表在圣彼得堡科學(xué)院的《柯尼斯堡的七橋》。該論文證明了柯尼斯堡七橋問(wèn)題中,符合條件的走法并不存在,同時(shí)提出和解決了一筆畫問(wèn)題。過(guò)橋問(wèn)題可以抽象簡(jiǎn)化為平面上的點(diǎn)與線組合,每一座橋視為一條線,橋所連接的地區(qū)視為點(diǎn)。從這個(gè)點(diǎn)出發(fā)的線有奇數(shù)條稱為奇點(diǎn),從這個(gè)點(diǎn)出發(fā)的線有偶數(shù)條稱為偶點(diǎn)。任意一種河──橋圖能否全部走一次的判定法則: 如果存在兩個(gè)以上(不包括兩個(gè))奇頂點(diǎn),路線不存在;且有n個(gè)奇頂點(diǎn)的圖至少需要n/2筆畫出。
1、經(jīng)典適用場(chǎng)景
- 路徑問(wèn)題(柯尼斯堡七橋問(wèn)題),最小生成樹(shù)問(wèn)題,斯坦納樹(shù)
- 網(wǎng)絡(luò)流與匹配問(wèn)題:最大流問(wèn)題,最小割問(wèn)題,最大流最小割定理,最小費(fèi)用最大流問(wèn)題,二分圖及任意圖上的最大匹配,帶權(quán)二分圖的最大權(quán)匹配
- 覆蓋問(wèn)題:最大團(tuán)、最大獨(dú)立集、最小覆蓋集、最小支配集
2、經(jīng)典算法
- 戴克斯特拉算法(D.A)
- 克魯斯卡爾算法(K.A)
- 普里姆算法(P.A)
- 拓?fù)渑判蛩惴?TSA)
- 關(guān)鍵路徑算法(CPA)
- 廣度優(yōu)先搜索算法(BFS)
- 深度優(yōu)先搜索算法(DFS)
二、Graphviz 簡(jiǎn)明指南
1、Graphviz 布局器
總的來(lái)說(shuō),Graphviz 支持兩類圖:無(wú)向圖(graph,用“ - - ”表示節(jié)點(diǎn)之間)和 有向圖(digraph,用“ ->” 表示節(jié)點(diǎn)之間)。頂點(diǎn)和邊都具有各自的屬性,比如形狀,顏色,填充模式,字體,樣式等。主要的布局器如下:
- dot: 默認(rèn)布局方式,主要用于有向圖;
- neato:基于 sprint model 模型,又稱force-based 或者 energy minimized;
- twopi:徑向布局,放射狀;
- circo:圓環(huán)布局;
- fdp:無(wú)向圖;
- dotty:一個(gè)用于可視化與修改圖形的圖形用戶界面程序;
- lefty:一個(gè)可以顯示 DOT 圖形的可編程控件,并允許用戶用鼠標(biāo)在圖上執(zhí)行操作。
2、Hello World!
$ brew install graphviz $ dot -Tpng demo.dot -o demo.png digraph demo{label="兒茶酚胺合成代謝路徑";酪氨酸 -> L多巴 -> 多巴胺 -> 去甲腎上腺素 -> 腎上腺素;下丘腦 -> 多巴胺;交感神經(jīng)元 -> 去甲腎上腺素;腎上腺髓質(zhì) -> 去甲腎上腺素,腎上腺素;酪氨酸 [label="酪氨酸",color=green];多巴胺 [label="多巴胺", color=red];腎上腺素 [label="腎上腺素", color=red];下丘腦 [shape=box];交感神經(jīng)元 [shape=box];腎上腺髓質(zhì) [shape=box]; }3、twopi 徑向布局
## 缺省為 dot 布局 $ dot -Kcirco -Tpng demo.dot -o demo.png三、應(yīng)用場(chǎng)景
1、軟件工程領(lǐng)域
軟件工程領(lǐng)域的復(fù)雜系統(tǒng)數(shù)據(jù)結(jié)構(gòu)分析和軟件包依賴關(guān)系管理。例如 Linux 內(nèi)核內(nèi)部結(jié)構(gòu)非常復(fù)雜,從概念上就由五個(gè)主要的子系統(tǒng)構(gòu)成:進(jìn)程調(diào)度器模塊、內(nèi)存管理模塊、虛擬文件系統(tǒng)、網(wǎng)絡(luò)接口模塊和進(jìn)程間通信模塊。這些模塊之間通過(guò)函數(shù)調(diào)用和共享數(shù)據(jù)結(jié)構(gòu)進(jìn)行數(shù)據(jù)交互,在涉及內(nèi)核版本、應(yīng)用程序升級(jí)等場(chǎng)景中,弄清楚模塊之間的依賴關(guān)系非常重要。
lsmod 命令用于顯示已經(jīng)加載到內(nèi)核中的模塊的狀態(tài)信息,Used by表示依賴的內(nèi)容。通過(guò) lsmod 命令獲取依賴信息之后,簡(jiǎn)單處理就可以轉(zhuǎn)化為圖形,而且圖形生成的全過(guò)程可以由程序固化。
$ lsmod Module Used by vboxdrv vboxnetadp,vboxnetflt,vboxpci nf_reject_ipv4 ipt_REJECT ebtables ebtable_filter ip6_tables ip6table_filter ip6_udp_tunnel vxlan udp_tunnel vxlan xor btrfs raid6_pq btrfs nf_nat_masquerade_ipv4 ipt_MASQUERADE xfrm_algo xfrm_user nf_defrag_ipv4 nf_conntrack_ipv4...... digraph kernel{vboxdrv->vboxnetadp,vboxnetflt,vboxpci;nf_reject_ipv4->ipt_REJECT;ebtables->ebtable_filter;ip6_tables->ip6table_filter;ip6_udp_tunnel->vxlan;udp_tunnel->vxlan;xor->btrfs;raid6_pq->btrfs;nf_nat_masquerade_ipv4->ipt_MASQUERADE;xfrm_algo->xfrm_user;nf_defrag_ipv4->nf_conntrack_ipv4;...... }基于 Graphviz 的一個(gè)開(kāi)源項(xiàng)目 PlantUML 支持快速繪制各類 UML 圖形:時(shí)序圖、用例圖、類圖、活動(dòng)圖、組件圖、狀態(tài)圖、對(duì)象圖等。
@startuml scale 600 width[*] -> State1 State1 --> State2 : Succeeded State1 --> [*] : Aborted State2 --> State3 : Succeeded State2 --> [*] : Aborted state State3 {state "Accumulate Enough Data\nLong State Name" as long1long1 : Just a test[*] --> long1long1 --> long1 : New Datalong1 --> ProcessData : Enough Data } State3 --> State3 : Failed State3 --> [*] : Succeeded / Save Result State3 --> [*] : Aborted@enduml2、通信工程領(lǐng)域
- nwdiag 是一個(gè)基于 Python 的、支持 Dot 腳本生成網(wǎng)絡(luò)圖的庫(kù)
- 結(jié)合 GIS 信息追蹤網(wǎng)絡(luò)路由
3、社會(huì)工程領(lǐng)域
- 決策樹(shù)(Decision Tree):人群鄙視鏈
- 復(fù)雜人物關(guān)系鏈分析(《紅樓夢(mèng)》、《權(quán)力的游戲》)
注意: 如果需要使用分組(Group)特性,子圖的名稱必須以“cluster”開(kāi)頭,否則無(wú)法識(shí)別
digraph family {label ="《紅樓夢(mèng)》人物關(guān)系譜·主要角色";subgraph cluster_皇族{label ="皇族";bgcolor="mintcream";node [ color="lightyellow", style="filled"];北靜王 [label = "北靜王",shape="Mrecord"];義忠順王 [label = "義忠順王",shape="Mrecord"];賈元春 [label = "賈元春(長(zhǎng)女)\n 鳳藻宮尚書·賢德妃",shape="Mrecord"];}subgraph cluster_寧國(guó)公{label ="寧國(guó)公(西府)";bgcolor="mintcream";node [ color="green", style="filled"];賈演 [label = "賈演 \n 寧國(guó)公"];賈代化[label = "賈代化 \n 爵位:一等神威將軍 \n 職務(wù)(武官):京營(yíng)節(jié)度使",shape="Mrecord"];賈演 -> 賈代化[label = "子"];......}...... }擴(kuò)展閱讀:數(shù)據(jù)可視化
- 數(shù)據(jù)可視化(一)思維利器 OmniGraffle 繪圖指南
- 數(shù)據(jù)可視化(二)跑步應(yīng)用Nike+ Running 和 Garmin Mobile 評(píng)測(cè)
- 數(shù)據(jù)可視化(三)基于 Graphviz 實(shí)現(xiàn)程序化繪圖
- 數(shù)據(jù)可視化(四)開(kāi)源地理信息技術(shù)簡(jiǎn)史(Geographic Information System
- Preview:數(shù)據(jù)可視化(五)可視化數(shù)據(jù)圖表制作方法
- 數(shù)據(jù)可視化(六)常見(jiàn)的數(shù)據(jù)可視化儀表盤(DashBoard)
- 數(shù)據(jù)可視化(七)Graphite 體系結(jié)構(gòu)詳解
更多精彩內(nèi)容掃碼關(guān)注公眾號(hào):RiboseYim's Blog:http://riboseyim.github.io/2017/09/15/Visualization-Graphviz/
轉(zhuǎn)載于:https://my.oschina.net/zijingshanke/blog/1541311
總結(jié)
以上是生活随笔為你收集整理的数据可视化(三)基于 Graphviz 实现程序化绘图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 快速的在Adobe Illustrato
- 下一篇: self-supervised text