本文根据杨振涛 2018 年 5 月 12 日在【第九届中国数据库技术大会】上的演讲内容整理而成。
分享大纲:
■ 数据可视化浅析
■ Circos 特性与关键原理
■ Circos 案例与适用场景
■ 可视化的再思考
在定《 Circos : The Beauty of Circle 》这个题目的时候,我有点担心大家会说这是什么鬼东西,另一方面我比较乐观的就是大家对它的好奇心。对可视化工程师来说,能够将自己做的事情清楚的表达给不了解它的人,这是一个很重要的挑战。
一.数据可视化浅析
数据可视化,对很多人来讲听到这个词会想到非常多的内容,包括有的人说我是做 BI 的,就是在做数据可视化,也是可以这样理解的;一些相关的开源项目也是比较多的,比如 ECharts ,很多做前端或 BI 的同学会用它来做前台界面的展示;还包括一些垂直领域的,比如网络数据 network 的展示,还有时间序列 timeline 类型数据的展示等。这里也提一下概念,提到数据可视化,很多人关心它跟信息可视化等这些概念的区别,在我看来,参考数据 - 信息 - 知识 - 智慧模型,数据可视化工作的目的就是加快上升和提炼的过程。
比如说很多老板非常喜欢看数据大屏,那要精确地定义数据做了那么多的分析,最后绘制了那么漂亮的图表,就给老板看一眼,这个价值到底在哪里?是不是 Boss 驱动开发?就为了满足老板的需求?其实这就是知识到智慧的提炼过程;因为如果老板的决策做错了的话,那么整个团队可能就完蛋了,那么他的决策依据怎么来? 就是依靠最后呈现的这些结果。
所以如果我们要定义一下,数据可视化是个什么样的问题呢?这里有一些备选答案,比如说它可能是个数据问题、编程 / 算法问题、设计 / 美学问题,或者有的人说是统计学问题,因为统计学家在多年前就开始做数据的分析和图表的绘制,后文有相应的案例。我个人的答案是 “ 以上全是 ” ,所以数据可视化是一个相对融合和跨界的工作。
我这里的数据案例会相对简单些,偏重为 Circos 做一个铺垫。注意这里不是概括,只列举了一些典型的数据类型。有些数据可能是典型的开源工具无法直接展示的数据类型,左下角这个图是 2016 年春运迁徙图,连外国人都会很关注中国的人口迁徙,原图是动态的,这个表达的信息就非常直观。
很多公司说我们在做大数据,有很多很多 T 或者很多 P 的数据,那如何让那些数据看得见是一个很重要的问题。从 Circos 的角度,它给的是这样的一个解法,这里给的基本都是 Nature/Science 等期刊的封面,呈现出一种很炫的效果,都是属于可视化的结果。
我们常说的浏览器,一般大家想到的就是 Chrome 、 Firefox 、 IE 等网页浏览器,其实我个人理解的更广义的浏览器是,对于一堆数据或者信息,要有一个工具看得见,那这个工具就是一个广义的浏览器。除了我们常说的 Chrome 之外,还有一些特别的例子:基因组浏览器,展示很多的基因相关的特征数据;虚拟天文馆软件,有对应的 App ,可以下载体验下;做开发的同学经常使用的 MySQL/Redis/MongoDB… 的 GUI 客户端,也属于浏览器的范畴。
关于浏览器的重要性,我们举两个例子,第一个是以柔光自拍等特点著称的 vivo 手机,对我们的位于杭州和硅谷的图像处理专家来说,他们看到的是二进制的,手机上除了 CPU 还有 GPU ,拍摄时会用于图像的实时计算,大家都知道图像数据是一个多维矩阵,对于我们开发人员来讲,它也是二进制的,但给用户呈现的时候就要比较漂亮。所以用户看到的是上面的第二张图片;除了单张图片之外,它还需要有一个集中的地方能看到所有的图片,即手机相册,目前的相册都是智能的,可以自动按主题、时间、地点等自动分类,还可以做人脸识别,按不同人分类,展示谁的照片有多少张,这就是一个图片的浏览器。
下面的例子是我做过的一个基因组的浏览器,基因的原始数据如图中第二行第一个所示,学过生物的同学可能还记得基因序列上有 ATCG4 种碱基,我们通过对样本经过基因测序仪分析后获得的基因数据就是长这个样子。对于分析人员来说,他需要方便地浏览器这些基因数据,人类有一些疾病就是因为序列上的一个字母出错了,变成其他字母而导致的;那么通过基因浏览器看这个图就能看出,基因的结构、起始、终止,以及基因的外显子和内含子,是否发生了变异等等。最后一张图是人的基因组,人类有 23 对染色体,点击之后可以看到每个染色体上的基因数据。
第一张图是深圳的路边停车收费告示,经常有人因为没看懂就被贴罚单;第二张图是国外一个可视化主题的大会上分享的案例,也是关于停车的告示,它其实也是一个多维数据的展示,里面只少了价格,每天 24 小时,每周七天,免费还是收费?能停还是不能停?清晰明了,如果再加上价格的话就完美了。从多个角度来看,这也许是个用户体验的问题,也许是数据结构梳理的不合理问题,也有可能是展示的方法不对。
前面我们介绍了很多数据本身的展示,其实数据和数据之间的关系的展示是一个更大的命题。这是一个韦恩图,大家最常见的是二阶和三阶,这个中学数学就学过,集合的交集就是这样一个关系;但是四阶、五阶相对见的比较少;可能会有六阶的,但我相信人类已经无法分辨六阶的关系了,因为太多。
上图是一个深度学习算法的可视化软件。大家知道深度学习经常用到神经网络模型,输入层、输出层,中间各种隐层,其中的网络也变得越来越复杂,算法设计写代码的时候不能直接凭空在脑袋里把它写出来,而是需要一个图形去参考,而且执行过程中可能有些关键模型参数也需要可视化。所以这个开源的深度学习可视化软件,会对算法做展示。
我们看到很多炫酷的东西,除了通用方案之外,如果这是一个专业领域的项目,要开发一个新的解决方案,就需要有一些基本的常识,比如说计算机图形学、平面空间的解析几何、常见坐标的转换,这些都是非常基础的,另外最好要掌握编程语言。
SVG 是一个非常特别的存在,我十年前大概练就了这样一个技能,就是徒手写 SVG ,而且可以写 js 代码实现 SVG 动效。当然现在大家就不用做这个工作了,因为有很多的矢量图编辑工具,就可以做这个事情,所以我个人认为,如果你要成为一个数据可视化的专家, SVG 几乎是你的必备技能之一。当然如果考虑更大范围的,比如 H5 支持的 canvas ,可以在网页上实现很多动效;还有 OpenGL 和 WebGL ,做游戏开发必须要了解的;还有一些 js 框架支持 3D 的表达,比如说 Three.js 。
一个图表有些基本的元素,比如它需要数据源、布局、视觉效果,重点是关于配色的。有的人说我的图画的很好,布局都很好,但是配色很难看;在就是制作(包括动画的制作)。一个典型的图表包括坐标系、坐标轴、刻度、图例、标题,这些是必须有的;做学术的人都知道,每个期刊对它的图表都有严格的要求,比如常用的三线表,不能说我认为是个表就放进去,这样就显得很不专业。其实这些要求是有原因的,以大家公认的方式来展示,大众会更容易去接受和理解。
上图是著名的白衣天使的代言人 —— 南丁格尔,大部分人只知道她是护士,其实她还有个身份就是统计学家,著名的玫瑰图就是她第一次用书面的形式,统计了二战期间战争的死亡率。她用玫瑰图的形式告诉当时的国家决策者,战后死亡率的第一原因并不是由战争本身,而是疾病传染。
这是百度开源的 ECharts ,左边是它支持的常见数据类型,类型非常丰富,右边的上半部分是更为复杂的一些数据类型,下半部分大数据墨镜官网里面支持的数据类型。这些类型都属于标准套餐。
在很多案例下标准套餐是不能解决所有问题的,所以我们有时需要编程实现,有的人用 matlab ,有的人用 R 。编程语言中一个典型的 plot 函数,它具有输入和输出两个部分,输入重点包括数据、布局、着色、图例等;输出包括图形的句柄。这里有两个链接,分享给大家可以去参考:
有哪些值得推荐的数据可视化工具?
https://www.zhihu.com/question/19929609
二十大数据可视化工具:
https://www.ctocio.com/hotnews/8874.html
总结一下,我们理解的数据可视化包括三个部分:
- 数据:广义的数据,它可能是数字化的也可能是非数字化的。
- 变换:变换的能力包括对业务领域的了解、方法论和算法的程序实现。
- 设计美学:要有对色彩的基本感知能力。
所以说数据可视化是技术也是艺术。
借用这个案例验证下我们的观点。谷德设计网上大部分都是建筑设计师、室内装修设计师以及各种跨界设计师的作品。上图是中国台湾邱外山作的课题叫《尾矿坑的自我再生机制》。这张图不仅是一个沙盘模型,它还有非常复杂的数据。如果说作为一个现代的设计师,不懂一点编程语言的话是跟不上时代的,这就是世界顶级的设计师的作品。
二. Circos 特性与关键原理
第一个是介绍圆,第二部分是 Circos 动手实践,第三部分是二次贝塞尔曲线。
提到圆,在中国的东方文化中,可能跟数学、哲学和天文相关。但是在编程和数学人的眼中,圆是上图中间的样子。我从多年前做技术面试,有一道经典面试题就是问如何画一个圆?有的同学很直接,调用一个现成的库函数,一个圆心坐标、半径,就画出来了。问及这个函数是如何实现的?能很好回答这个问题的人相对较少。那么如何画一个圆?有几个关键的地方:
1. 画图本身是一个描点的过程,这是最基本的常识;
2. 最好掌握圆的参数方程,圆是最简单的几何图形。
科幻迷可能比较喜欢电影《降临》,影片讲述的是外星人相关的故事。外星人有一种语言,呈现在空中,看上去是不同样式的圆形。电影中的主角是一个人类语言学家,右边是他们做的分析: “ 外星人说我不是来侵略地球的,我是来帮助人类的。 ”所以它为什么用圆?很难直接回答,但是有一个好处就是,通过不同的变换,圆可以快速地传递出不一样的信息。圆周上可以做各种不一样的描述,看起来有点像设计师做的泼墨艺术,其实表达是非常精确的。
这是一个典型的 Circos 图,第一眼看有点像八卦图,第二眼看跟八卦图又没什么关系。简单介绍 Circos ,官网http://circos.ca ,它是 Perl 语言开发, GPL 开源协议,配置文件驱动,输出 PNG/SVG 格式的图片,丰富细致的教程文档。它的作者几乎每天都在邮件里回复别人的问题,如果你有问题也可以直接问他。其实这个软件的论文在十年前就发表了, 08年就有了, 09 年正式发表。 Circos 最早是用于基因组学领域的,基因组学典型的就是要做这样的呈现,目前越来越多的用于很多其他行业和领域。
这是 Circos 的作者 Martin Krzywinski ,波兰人,目前在加拿大。刚开始他只是做系统管理员(俗称网管),然后做生物信息科学家,同时他是一个职业的摄影师。有拍过很多人像、静物、时尚的图片。下面两幅图片都是他在自己管理的机房拍摄的,充满了艺术气息,他的职业背景会对他能做出 Circos 这样一个开源工具有非常好的铺垫。
动手实践 Circos ,去官方网站下载,我在 github 也做了个镜像方便浏览代码, wget 下载下来,解压之后就是右侧的目录,看起来非常简单,但后面安装可能稍微会遇到一点儿麻烦。
正常来说,大部分 Linux 系统都是自带 Perl 环境的,解压之后直接可以使用,但是因为 Circos 有依赖很多第三方工具包,所以要使用 ./circos -modules 这个命令去查看它依赖的包哪些是缺失的?哪些是安装的?右边这个图截了两个框,比如说Config 这个包 missing ,就表示机器上的 perl 没有安装这个第三方的模块,你要通过下面的命令给安装好,只要这个列表中所有的 missing 都变成 OK , Circos 就可以使用了。
Circos 的 Hello World ,到 bin 目录,直接进行 circos -conf circos.conf ,把配置文件指定好,它就可以运行了。
如果跑示例,则切换到示例目录,直接执行 ./run 。
在业内像 DTCC 这种规模的大会上, Circos 相关的内容还没有人分享过,所以这应该是第一次。 Circos 工具是如何描绘出我们刚开始看到的很复杂很漂亮的圆形图的呢?类似把大象关进冰箱,只需三步。第一步,使用一个全局的配置文件,要用什么数据,要画成什么样子的图,把这个事情定义好;第二步,执行 Circos 命令,告诉它用哪个配置文件;第三步,它就会输出结果图 svg ,默认的一般都是 svg ,如果你需要放到杂志上去发表,加一个选项它会生成 png 。
来看看在配置文件中有哪些最重要的部分。第一个是全局的配置,比如说这个圆形要画多大,即半径多少,以前默认是 3000像素,还有图片相关的参数,图片分辨率、样式相关的,比如说颜色字体;还有调试相关的参数。上半部分是非数据相关的配置,下半部分是数据相关的配置。
只要能画出了一个圈,其他的圈无非是半径扩大了。圈上有丰富的数据对象、刻度信息,还有每个数据对象之间连接的信息,所有这些元素准备 OK 了,一个 plot 就画出来了。有的人说要对数据做一些过滤,或者做一些局部放大操作,那么 rules 就可以实现。 Ideogram 在这个语境下,它是一个分布在圆周上的数据对象,类比基因组领域人的 23 个染色体中的一个。用 link来表示它们的连接关系,还有黑白相间的条带,以及刻度、标签、高亮等等。
其实了解核心算法在绘图时是非常有帮助的。第一个图是常见的二维平面坐标系,有 x 轴 y 轴。第二个是极坐标,偏转的角度就决定了极坐标中点的位置。第三个为什么要做坐标转换?为了方便计算,在 svg 绘图时,它的右上角是原点,它的 Y 轴是向下的,所以在极坐标系把这个点定位了之后,它的坐标必须翻译成 svg 的坐标,这样在 svg 里才能做运算。
运算完后的绘制过程,又要翻译成二维的坐标,这样才能告诉计算机的绘图设备,这个点要描到哪里。所以说经历了三次的坐标转换。如何在圆周上均匀的分布这些线段?其实很简单,假如说我们在 12 点位置定义为零度,圆旋转一周是 360 度,有十个点,那我就把这 360 度分成十份,从零度开始偏转,两个对象之间还会留一个间隔,加上间隔就是下一个点的起始,这个图就绘出来了。
贝塞尔曲线是法国的数学家 Pierre Bézier 提出的,常见的有一次、二次、三次,它的次数是指上面动点的个数,一次就是线段,只有一个动点。我们在这里用的最多的就是二次的贝塞尔曲线,两个点之间想要连一个曲线。有的人画出的曲线看出来是非常的完美,曲线的中间刚好是两个点的中心上,有的人画出来是偏左有的是偏右。有时你想同时偏左或偏右的,那它是怎么实现这些功能?
第一个图使用的是一次贝塞尔曲线,其实就是直线。看上去比较凌乱,如果我要调整这些点之间的关系是非常难的。中间的图,给它一个参数 crest ,通过调整半径能看到曲线的曲率发生变化。最右边是设置的一个特殊值,像在地球外周画卫星运行轨迹的一个图,这样我们就可以精确的去控制它。
数据对象的排布:有的图连线看上去规律非常强,有的则是乱糟糟的。那这个东西是如何控制的呢?圆周上两条线是否相交,它要满足一些条件。曲线 i 和 j 两个是不相交还是相交,它们的角度是有一定关系的,满足这个关系就不相交。也就是说想要画出连接关系比较整齐规律性很强,就要确保这些线相交关系数是最少的。直接看可能比较复杂,但是用起来还是非常好用的,有兴趣的同学可以去官方文档去研究他的算法。
有人说我的 Perl 语言功底有限,起步确实有点难,就是想去体验一下。也有一个在线版本,提交你自己的数据, Circos 帮你在服务器上绘制这个图并展示在网页上,右边的图就是在线绘出来的。
Circos 本身是 Perl 语言开发的,很强大,但是出来之后也有一些问题:
• 要求一定的编程知识,最好了解一点儿 Perl
• 安装简单,但依赖的部分 Perl 模块兼容性复杂
• 不提供其他编程语言的 API
• CLI 命令行交互。
有的人完全不了解 Perl ,花了点时间去学习感觉也很难入门。虽说安装简单,但是过分依赖的 Perl 模块兼容性比较复杂,不提供其他语言的 API ,是 CLI 命令行交互的,对于编程功底不好的人来说是个挑战。
所以有人做了这样一项工作,在 R 语言里开发了一个几乎跟 Circos 功能是一模一样的包,掌握 R 语言,想画一个类似 Circos这种图形来表达数据关系,可以使用这个包。还有另外一个 R 语言的包,好处就是绘制的过程是可交互的,而且有在线的地址,这个其实类似于 Circos 在线的版本。
除此之外还有非常多,每个都非常具有特点,甚至还有人把它做成一个 Chrome 插件的形式去绘制。
Circos 绘制出来的图就是一个圆形,怎么根据业务需求往上添加描述的文字,甚至一些其他的小图?答案是使用矢量图编辑工具,但如果你画出来的图比较大,那你要自己去评估这个矢量图编辑工具能不能满足你的需求。第二个方法,掌握最基本的SVG 如何定义坐标,手写 SVG 加入新的元素。
三. Circos 案例与适用场景
刚开始 Circos 几乎是基因组学的必备技能,每一个基因组测序的时候都会用这个图,我自己参与过炎黄 1 号 - 第一个中国人全基因组、熊猫基因组、黄瓜基因组。每个基因组测序项目完成后,会使用 Circos 图来展示整个基因组上的各个层次的特征数据及其关系。 另一个案例是 DHL ,使用 Circos 来表达全球各个国家和地区之间相互往来的快递件数量关系。
刚才提到的国外的一个关于可视化的会议,它叫 VIZBI ,但是它不是我们常说的那个 BI ,它这个 BI 是指生物数据。大家能看到这些绚烂的图主要是在生物领域的一些应用,如果你自己的业务领域有类似需求,也可以借鉴过来。
总结一下 Circos 适用的一些典型场景的特征。第一个是 有限个数据实体或者实体组 ,有的人说我有 20 万个不能合并的数据实体,用 Circos 来展示是不合适的,因为展示出来的图形是肉眼无法分辨的。
第二个是 实体间的关系复杂但可以量化,需要区分有方向。比如 两个人之间的情感关系很难量化,不适合用 Circos 这个图展示。如果说这个关系需要区分方向,比如说社交网络上的加好友的关系,就是我加了你好友,你没有加我好友,那它是一种状态,还有是我们两个相互加了好友,它这个是双向的关系,有方向是可以使用 Circos 的。
还有一种是 需要不同分辨率或者局部放大 , Circos 大家看上去是个圆周,其实圆周上的每一个区域都可以放大很多倍,成比例关系。 最后一个就是 需要多维度 , Circos 的每一圈都可以是一个维度,而且这个维度之间可以发生关系。 全局观测与局部细节并重,需要多维度趋势对比。
四.可视化的再思考
elastic 技术里面的 Kibana ,这个产品为什么出色?是它有良好的可编程性,它既满足了通过拖动就直接能看到图片,又满足了查询语句,把数据先查出来再去展示。 Grafana 很多做运维的人会使用,用于展示这个机房有多少台服务器,每个服务器的负载是什么样?有多少业务,它的 pv 数据是什么样? Grafana 的能力是平台化能力很强,业内几乎所有主流的数据存储它都支持,常见的包括 Oracle 数据库,平台化的能力让 Grafana 脱颖而出。
接到一个需求时,比如说要画一个什么图,大家可能认为可视化工程师就是一个画图的人;其实没这么简单,要画出这个图来让需求方满意是需要做很多工作的。这里介绍下阿里云的这个 Quick BI 和 DataV 相关的产品。它分为三步,第一个数据的存储位置,是日志数据还是 RDS 关系型数据库数据;第二个中间做 max compute 做计算、做存储、做分析;最后是前端,配合 BI 做联机的展示,绘制静态图。
所以整体几乎跟右边我们做软件开发的流程一样。我们抽象一下,有三个关键环节:第一个,数据,数据的质量对可视化的效果有非常大的影响,数据中的噪点过多会导致可视化出来的效果几乎无法观看,看不出自然的规律;第二个,查询(搜索视角),这些数据对于可视化来说应该是只读的,你对原始数据做了各种加工,可以生产中间数据,最后用它来做展示;最后一步就是视图,使用标准套餐来表示,还是需要开发专门的定制程序。
数据可视化的工作有两类,第一个是标准套餐可以实现的,有平台化、工具化的东西。第二种是项目化客户定制专案。比如说阿里有做一个云栖小镇、智慧小镇、人工智能小镇,镇长坐在办公室里面,整个镇上发生的人、物、事件,所有东西都是可以看得到的,它是一个典型的数据专案项目,需要专门去开发。