数据可视化(三)基于 Graphviz 实现程序化绘图

摘要

  • OmniGraffle 和 Graphviz
  • Why draw when you can code?
  • Graphviz 简介
  • 最佳 Graphviz 实践(一):流程图、数据结构图、网络路径 Trace Route
  • 最佳 Graphviz 实践(二):复杂社会关系链分析(《红楼梦》、《权力的游戏》)
  • 最佳 Graphviz 实践(三):机器学习算法-决策树(Decision Tree)

前言

我之前在几篇文章新一代Ntopng网络流量监控—可视化和架构分析
数据可视化(一)思维利器 OmniGraffle 绘图指南 |201601,都曾提到了力导图,在关于 OmniGraffle 的文章结尾还吐槽了一番自动布局按钮的坑。在本文中我力求将这个坑填上。

OmniGraffle 生成自动布局图形的基础是 Graphviz 引擎。Graphviz(Graph Visualization Software)是一个由AT&T实验室启动的开源工具包,能够支持基于 DOT 脚本,文件扩展名通常是 .gv 或 .dot 的描述绘制图形。DOT 是一种文本图形描述语言,将生成的图形转换成多种输出格式的命令行工具,其输出格式包括PostScript,PDF,SVG,PNG,含注解的文本等。DOT 本身非常原始,提供了一种非常简单的描述图形的方法,同时意味着可以在命令行终端使用,或者被其它编程语言调用(Graphviz 就可以作为一个库使用)。这一点非常关键,基于 Graphviz 应用开发者不必掌握布局的复杂算法,而是可以把精力放在业务方面,将最后的图对象交给绘图引擎来处理即可。

有趣的是 Graphviz(Mac 版) 和 OmniGraffle 都曾获得苹果设计奖 Apple Design Awards

在深入掌握 Graphviz 及其相关衍生应用之前,我们有必要了解一些基础理论 —— 图论(Graph theory)。

一、背景知识:图论(Graph theory)

  • 柯尼斯堡七桥问题

东普鲁士柯尼斯堡(今日俄罗斯加里宁格勒)市区跨普列戈利亚河两岸,河中心有两个小岛。小岛与河的两岸有七条桥连接。在所有桥都只能走一遍的前提下,如何才能把这个地方所有的桥都走遍?

许多数学家都尝试去寻找这类问题的解决方案,后来发展成为了数学中的图论。图论史上第一篇重要文献是莱昂哈德·欧拉在1736年发表在圣彼得堡科学院的《柯尼斯堡的七桥》。该论文证明了柯尼斯堡七桥问题中,符合条件的走法并不存在,同时提出和解决了一笔画问题。过桥问题可以抽象简化为平面上的点与线组合,每一座桥视为一条线,桥所连接的地区视为点。从这个点出发的线有奇数条称为奇点,从这个点出发的线有偶数条称为偶点。任意一种河──桥图能否全部走一次的判定法则: 如果存在两个以上(不包括两个)奇顶点,路线不存在;且有n个奇顶点的图至少需要n/2笔画出。

1、经典适用场景

  • 路径问题(柯尼斯堡七桥问题),最小生成树问题,斯坦纳树
  • 网络流与匹配问题:最大流问题,最小割问题,最大流最小割定理,最小费用最大流问题,二分图及任意图上的最大匹配,带权二分图的最大权匹配
  • 覆盖问题:最大团、最大独立集、最小覆盖集、最小支配集

2、经典算法

  • 戴克斯特拉算法(D.A)
  • 克鲁斯卡尔算法(K.A)
  • 普里姆算法(P.A)
  • 拓扑排序算法(TSA)
  • 关键路径算法(CPA)
  • 广度优先搜索算法(BFS)
  • 深度优先搜索算法(DFS)

二、Graphviz 简明指南

1、Hello World!

总的来说,Graphviz 支持两类图:无向图(graph,用“ - - ”表示节点之间)和 有向图(digraph,用“ ->” 表示节点之间)。顶点和边都具有各自的属性,比如形状,颜色,填充模式,字体,样式等。主要的布局器如下:

  • dot: 默认布局方式,主要用于有向图;
  • neato:基于 sprint model 模型,又称force-based 或者 energy minimized;
  • twopi:径向布局,放射状;
  • circo:圆环布局;
  • fdp:无向图;
  • dotty:一个用于可视化与修改图形的图形用户界面程序;
  • lefty:一个可以显示 DOT 图形的可编程控件,并允许用户用鼠标在图上执行操作。
$ brew install graphviz
$ dot -Tpng demo.dot -o demo.png
## 缺省为 dot 布局
$ dot -Kcirco -Tpng demo.dot -o demo.png
digraph demo{
  label="儿茶酚胺合成代谢路径";

  酪氨酸 -> L多巴 -> 多巴胺 -> 去甲肾上腺素 -> 肾上腺素;

  下丘脑 -> 多巴胺;
  交感神经元 -> 去甲肾上腺素;
  肾上腺髓质 -> 去甲肾上腺素,肾上腺素;

  酪氨酸 [label="酪氨酸",color=green];
  多巴胺 [label="多巴胺", color=red];
  肾上腺素 [label="肾上腺素", color=red];

  下丘脑 [shape=box];
  交感神经元 [shape=box];
  肾上腺髓质 [shape=box];
}
儿茶酚胺合成代谢路径-dot 布局

儿茶酚胺合成代谢路径-twopi 径向布局

应用场景

1、软件工程领域

软件工程领域的复杂系统数据结构分析和软件包依赖关系管理。例如 Linux 内核内部结构非常复杂,从概念上就由五个主要的子系统构成:进程调度器模块、内存管理模块、虚拟文件系统、网络接口模块和进程间通信模块。这些模块之间通过函数调用和共享数据结构进行数据交互,在涉及内核版本、应用程序升级等场景中,弄清楚模块之间的依赖关系非常重要。

lsmod 命令用于显示已经加载到内核中的模块的状态信息,Used by表示依赖的内容。通过 lsmod 命令获取依赖信息之后,简单处理就可以转化为图形,而且图形生成的全过程可以由程序固化。

$ 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;

        ......
}
软件包依赖案例-Linux Kernel 1
软件包依赖案例-Linux Kernel 2
软件包依赖案例-Linux Kernel 3

基于 Graphviz 的一个开源项目 PlantUML 支持快速绘制各类 UML 图形:时序图、用例图、类图、活动图、组件图、状态图、对象图等。

@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 long1
  long1 : Just a test
  [*] --> long1
  long1 --> long1 : New Data
  long1 --> ProcessData : Enough Data
}
State3 --> State3 : Failed
State3 --> [*] : Succeeded / Save Result
State3 --> [*] : Aborted

@enduml

2、通信工程领域

  • nwdiag 是一个基于 Python 的、支持 Dot 脚本生成网络图的库
  • 结合 GIS 信息追踪网络路由
网络拓扑图
pip install nwdiag
nwdiag simple.diag
nwdiag -Tsvg simple.diag
nwdiag {
  network dmz {
      address = "210.x.x.x/24"

      web01 [address = "210.x.x.1"];
      web02 [address = "210.x.x.2"];
  }
  network internal {
      address = "172.x.x.x/24";

      web01 [address = "172.x.x.1"];
      web02 [address = "172.x.x.2"];
      db01;
      db02;
  }
}
traceroute 案例
[root@li1437-101 ~]# traceroute www.google.com
traceroute to www.google.com (216.58.216.36), 30 hops max, 60 byte packets
 1  23.92.24.2 (23.92.24.2)  0.704 ms  0.736 ms 23.92.24.3 (23.92.24.3)  0.575 ms
 2  173.230.159.16 (173.230.159.16)  0.910 ms 173.230.159.14 (173.230.159.14)  2.265 ms
        173.230.159.0 (173.230.159.0)  0.731 ms
 3  as15169.sfmix.org (206.197.187.50)  4.039 ms eqixsj-google-gige.google.com (206.223.116.21)  0.718 ms
        as15169.sfmix.org (206.197.187.50)  3.944 ms
 4  108.170.242.227 (108.170.242.227)  4.902 ms
        108.170.242.226 (108.170.242.226)  3.003 ms
        108.170.243.2 (108.170.243.2)  3.064 ms
 5  216.239.47.37 (216.239.47.37)  4.836 ms 64.233.174.91 (64.233.174.91)  1.476 ms  1.447 ms
 6  216.239.54.22 (216.239.54.22)  12.464 ms  29.292 ms 64.233.174.204 (64.233.174.204)  9.032 ms
 7  209.85.245.172 (209.85.245.172)  10.633 ms
    108.170.230.130 (108.170.230.130)  20.010 ms
        108.170.230.124 (108.170.230.124)  8.988 ms
10  lax02s22-in-f4.1e100.net (216.58.216.36)  10.358 ms  10.383 ms  10.301 ms
digraph {
    label="Google Trace Sample";
    "23.92.24.2" [label="23.92.24.2 \n Fremont,California \n location:37.5670,-121.9829"] ;
    as15169 [label="as15169.sfmix.org \n San Francisco \n Metropolitan Internet Exchange"];
    "108.170.242.227" [label="108.170.242.227 \n California \n location:37.4192,-122.0574"];
    lax02s22 [label="ax02s22-in-f4.1e100.net \n Los_Angeles,California \n location:46.07305,-100.546"];
    "23.92.24.2" -> as15169 -> "108.170.242.227"  -> lax02s22;
}

3、社会工程领域

  • 决策树(Decision Tree):人群鄙视链
  • 复杂人物关系链分析(《红楼梦》、《权力的游戏》)
《红楼梦》宁国府世系
鄙视链案例-婚姻市场中的房市-dot
鄙视链案例-婚姻市场中的房市-circo-圆环布局

http://riboseyim.github.io/2017/09/15/Visualization-Graphviz/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容