【转载】那些精彩的数据可视化是怎么实现的?在这篇文章你可能会找到方法

今天在公司看到数据可视化的效果,很直观很酷炫。正好之后的产品可能会涉及到这块内容,就查了查相关资料。这篇文章还是比较清晰明了的。
转载地址:https://zhuanlan.zhihu.com/p/20366289
作者:Xhinking

Apple Pencil 刚刚上市没几天便被 iFixit 拆解,以供人们欣赏其优秀的内部工程设计。没错,当我们遇到极其精妙与魔法无异的事物时,好奇心总会驱使我们去探究它背后的原理。
对于数据可视化来说更是如此。
最近在知乎看到一个问题:”圆形锯齿数据可视图是如何做出来的?”,其中提到的可视化图出自网易数读新闻《中国危险化学品事故多发地分布》,如下图所示:

这则数据新闻中的可视化数据图本身并不复杂,在尝试重制后我觉得可以整理一下思路,分享给大家作为参考,希望能对逆向可视化案例有些帮助。
通过本文可以了解到:

  1. 逆向一个可视化案例的大致步骤;
  2. 类似"圆形锯齿”数据可视化图是如何实现的;
  3. 更多的类似的数据可视化的设计。

第一步:分析原始数据
数据是可视化背后的主角,逆向可视化与从零构建可视化的第一步一样:从原始数据入手。不同的是在逆向时我们看到的是数据经过图形映射、加工、修饰后的最终结果,而原始数据隐藏在纷繁复杂的视觉效果中。抛开华丽的可视化效果,从中找到数据、分析数据是我们的首要工作。
此例的数据结构比较简单,从图中可以方便的整理出来,如下表所示:

有些可视化案例的原始数据可能会比较复杂,不能从图中很方便的整理出来,可通过项目介绍中数据来源来寻找原始数据。

原始数据包含了 31 个省、直辖市、自治区在 2007 年至 2011 年的事故数与死亡人数,数据之间并没有太深层次的逻辑关系,只是单纯的数值。
分析原始数据及其结构可以帮助我们还原可视化作者最初拿到数据时的场景,帮助我们更好地揣摩设计者的想法,理解设计思路,为进行下一步的图形分析做准备。
第二步:分析图形
图形是可视化中的关键元素,也是我们最关注的部分。分析可视化中的图形可以从很多角度来进行,我们可以先从整体入手,利用经验尝试解答以下几个问题:

  • 之前是否见过类似的可视化案例?
  • 案例是否属于某种常见的可视化形式?
  • 案例是否是某种可视化形式的演进变化形式或某几种可视化形式的组合?

在本例中,“圆形锯齿数据可视化图”其实可看做是在雷达图(Radar Chart)基础之上的修改形式。雷达图有很多别名或类似形式,例如星状图(Star plot)、蛛网图(Spider chart)等等(它们有个共同的特点就是基于极坐标系的)。

我们现在看到的大多数可视化案例都是从某种基础的可视化方法演进而来,借鉴经典可视化方法,并在其基础之上进行创新。 如果可以通过图形大致确定可视化的形式,就可以借助一些专有工具快速做出相似原型。
我们还可以利用更为通用、更深层次的方法来分析:将可视化划分为不同的组件与层。Leland Wilkinson 在 《The Grammar of Graphics》**中阐述了一种描述统计图形的语法,把图形拆分为一些相互独立、可组装的模块元素。例如下图的例子,将坐标系看做一个组件,在不修改其他图形元素的情况下,仅仅通过修改不同的坐标系我们就能获得不同的统计图:
图形语法的出现让我们有了更加适合描述可视化图形的方法。R 语言中著名的 ggplot2 图形包就是 Hadley Wickham 基于这个理论而建立的,其名字中的 “gg” 指的便是 Grammar of Graphics。
Nathan Yau 在 《Data Points》中也介绍过类似的方法,将可视化组件分为:视觉暗示(几何特征)、坐标系、标尺、背景信息。视觉暗示包含位置、长度、角度、方向、形状、面积、体积、饱和度、色调,如下图所示:
坐标系包含常见的直角坐标系(笛卡尔坐标系)、极坐标系(根据夹角和距原点距离定位)、地理坐标系等。将不同的视觉暗示与不同的坐标系相组合,会产生很多种不同的可视化效果。《Data Points》书中的这幅图很好的展示了可视化组件进行组合的强大表现力(点击查看大图):
基于图形语法,数据可视化可以看做是由不同组件构成的不同图层叠加复合而成。就像 PhotoShop 中的图层一样,复杂的视觉效果可以拆分成不同几何特征、不同坐标系、不同标尺所构成图层的组合。我们经常会看到很多复杂的可视化案例,当无从下手时,分类拆分成各种基础组件和图层是一个很好的方法。
回到案例,我们将整个图拆分为以下几个元素:

  • 省、地区文字标签
  • 死亡人数、事故数数值标签
  • 死亡人数折线
  • 事故数面积图
  • 事故数刻度标尺(白色)
  • 极坐标

于是,我们便得到了一个分层展开的可视化图:

拆分结构后,我们看到了一个由多层基础元素组成的结构:折线、文字标签、数字标签。这里的折线图和面积图其实本质上是常见的折线图和面积图,只不过由直角坐标系变成了极坐标系,从而形成了锯齿状的整体图形。
第三步:深入挖掘背后技术
通过上面的分析我们其实已经可以通过一些工具制作出类似可视化效果。但是作为可视化硬核玩家的你不能止步于此,应该深入地了解更底层的实现方法。我们可以查看开源工具的源代码,例如我们可以从 d3-plugin 的项目代码中发现一些可视化的具体实现方法。还可以搜索与案例相关的博客或者论文等等。
并不是所有的可视化方法背后都有一个复杂的算法,大部分可视化技术用到的也许只是一些基础数学知识。
在逆向时,可以先将问题转化为一个简单的模型,例如在本例中,我们可以将问题简化为“如何将 n 个点均匀的排列在一个半径为 r 的圆上”。通过三角函数可以很方便的解决这个问题,如下图所示:
而死亡人数折线的数据点坐标即为半径为 r + scale(death) 圆形上对应的点。同理,事故数的数据点坐标即为半径为 r + scale(accdient) 圆形上对应的点,如下图所示:

第四步:实施
进行到这里,难道你不想亲自实现一下可视化效果吗?有了数据、分析了结构、深入理解了背后的原理,具体实施将会变得十分简单,可以根据需求选择适合自己的工具。我在这里选择使用 d3.js 简单的实现了一下,仅供参考。
第五步:可读性优化
在上面的分析中我们可能漏掉了一些细节:针对可读性进行优化。可读性会直接影响可视化内容的质量,混乱的颜色、重叠的标签都会大大降低可读性。在逆向可视化案例时,我们应该注意发现和积累对可读性优化的方法,以更好地应用到自己的案例中去。
在中国危化事故可视化图中,我们可以看到为了提高可读性,做了以下几点调整:

  • 处于圆形下半部分的省、地区文字并没有像上半部分的文字一样指向圆心,而是背离圆心。保证了下半部分文字的可读性;
  • 事故数与死亡人数数值标签如果过于靠近则需要调整标签位置,以免重叠。

提高可读性的工作可能并不充满乐趣甚至是痛苦的:不断的手动调整参数、硬编码数值、破坏已有代码和设计等等。但是为了更好的体验,这部分工作是非常值得的。不考虑可读性,仅仅追求视觉效果并不可取。
等等,还没有结束
在完成了上面的步骤之后,我们可以想想如何来改进这个可视化,让它变得更好。数据是否有值得深挖的地方?是否可以展现更多更有趣的信息?设计上是否已经做到完美?
在本例我们可以看到一些问题:城市在圆形的分布上并没有什么规律性,能否进行一下排序或者再添加一些数据维度,例如按照人口排序或者将各省市按照 GDP 在圆形上排序是否就可以看出危化事故与经济水平的关系等等。
小结
至此,我们的逆向之旅可以画上句号了。总结一下我们走过的步骤:

通过上面的步骤,我们基本上可以还原一个可视化内容的产生路径,也从中学到了很多知识。在学习资源较少的可视化领域,深入地逆向自己喜欢的可视化作品,不失为一种好的学习方法。
在看到一个可视化作品时,我们应该像庖丁一样:目无全『牛』,看到可视化背后的数据、组件、图层、几何模型,看到更多的数据可视化之美。
更多案例
下面是一些与《中国危化品事故统计》类似的可视化案例,形式上与《中国危化品事故统计》十分类似,在设计和数据的深度上有更多值得学习的地方。
Weather radials** 是一个关于城市温度与降水的信息图。整个圆形代表一个城市,圆形中围绕圆心的柱状图代表一年中每天的最高温度与最低温度。浅蓝色的圆形代表降水量。
有人用 D3.js 实现了类似的项目,New York 2015 Historical Weather Data**
Weather Eindhoven 2014** - 下面也是一个关于城市气候的可视化案例。埃因霍温位于荷兰南部,气候属于暖温带气候。降水在埃因霍温非常普遍,全年平均降水量为 776 mm。图中圆心部分是温度分布,红色代表对应日期的最高气温,白色代表最低气温。外侧绿色柱状图代表降水量,最外侧由线连接的点代表风力。
Brain dance** 是一个关于人脑对音乐反应的可视化项目。该图记录了其中一位志愿者在听到 kleemar** 为该项目特殊制作的一首音乐时的脑电波。这首音乐的时间为 2 分 14 秒(134秒),可以看到整个圆形按每秒中被划分为了134秒。主要记录了 Focus (专注)和 Flow (放松) 两组指标的变化数据,制作出了该项目。
Quantified self data visualization**
下面是用 Nodebox 实现的一个关于睡眠的自我量化信息图。整个圆形代表 8 小时的推荐睡眠时间,每个颜色代表一个人,靠近圆形代表重度睡眠(sonno profondo),圆形外代表轻度睡眠(sonno lieve)。每根线结尾部分的虚线代表睡眠不足(sonno perso)的时间。

(正文完)
相关书目:
《The Grammar of Graphics》 - Leland Wilkinson
《Data Points》 - Nathan Yau 中文版《数据之美:一本书学会可视化设计》
相关链接:
知乎提问:圆形锯齿数据可视化图是如何做出来的?
网易数读:中国危险化学品事故多发地分布**
d3-plugin - Github
使用 d3.js 重制的案例 - CodePen

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

推荐阅读更多精彩内容