当我们谈论数据可视化时,我们实际谈论的是将数据通过系统化、有逻辑的方式转化为最终的视觉呈现。数据可视化图形有很多种类:初看散点图(scatter plot)、饼图(pie)和热力图(heatmap)并没有什么共同点,实际上这些图形背后都有一套基础图形语言:捕获数据,并将数据转化为纸上的墨点,或是屏幕上的像素。其内在本质在于:数据可视化将原始数据映射为直观可量化的视觉特征,我们将其称为图形元素(aesthetics)。
1. 图形元素
图片 1.1:图形元素通常包含的信息有 位置(position), 形状(shape), 尺寸(size), 颜色(color), 线段宽度(line width), 线段类型(line type) 等。 有些信息是可以同时是连续型(continuous) 或离散型(discrete) ,比如 position,size,line-width,color ,而其他通常只能是离散型的。
上图包含了一些基础的图形元素。图形元素有一些关键特征,首先是位置(position),用来描述元素的位置信息。通常在 标准 2D 空间中,用 x, y 来描述位置信息,当然在 1 维 或者 3 维空间有其他的位置描述方式。 然后,所有的图形元素有 形状(shape), 尺寸(size),颜色(color) 等信息,即使我们只是绘制黑白元素,我们也要给图形元素设置合适的颜色用于展示,譬如在白色背景上可以绘制黑色图形,但是白色图形就不行了。最后,我们在有些场景下会应用不同宽度的线段和不同类型的线段(实线、虚线等)。
在上图之外,我们还会遇到更多的图形元素,譬如展示字体是需要考虑字体系列(font family),字体大小(font size),如果要处理图形相互覆盖,还需要考虑到图形透明度变化。
图形元素可以分为两大类:连续型和离散型。连续型含义是任意两个数据之间都可以存在中间状态,比如时间就是连续型的,50s 和 51s 之间还可以存在 50.5s,50.51s 甚至更多。相互在一个房间可人数是离散的,房间可以容纳 5 人或者 6 人,但不能是 5.5 人。图上 position、size、line width,color 可以是连续型的,而 shape 和 line type 通常只能是离散型。
接下来我们来看下需要展示的数据的种类。通常你可能会觉数据应该是数字类型的,但其实数字只是可视化数据中的两个类别而已。如下表所示,除了连续型和离散型数字之外,还可以通过离散型类别(cetegory)、日期或者时间形式(date/time)和文本(text)形式呈现。如果数据类型是数字,我们称之为定量(quantitative),如果数据类型是其他类型,我们称之为定性(qualitative)。定性的变量被称为因子(factor),不同类别(category) 称为级别(level)。因子的级别通常是无序的(dog, cat, fish),不过也可以是有序列表(good,fair,pool)。
变量类型 | 示例 | 变量分布 | 描述 |
---|---|---|---|
连续数字 | 1.3, 5.7, 83 | 连续型 | 连续的数字类型,可以是整数,也可以是小数 |
离散数据 | [1, 2, 3] | 离散型 | 离散的数字单元 |
无序类别 | dog, cat, fish | 离散型 | 类别之间无顺序关系,也被称为因子 |
有序类别 | good,fair,pool | 离散型 | 类别之间有顺序关系,也被称为有序因子 |
日期或时间 | Jan. 5 2018, 8:03am | 离散型 or 连续型 | 查看一段连续时间时可以是连续型数据 |
文本 | 我的名字 | 无 or 离散型 | 普通文本 |
表格 2.1
下面我们来看一组具体数据,来自美国 4 个城市的天气数据。数据包含了 5 列信息:Month,Day,Location,Station ID, Temperature。其中 Month 是有序因子(ordered factor),Day 是离散的数字类型,location 和 Station ID 是无序因子(unordered factor),而 Temperature 则是连续的数字值。
表格 2.2 一组真实天气数据
Month | Day | Location | Station ID | Temperature |
---|---|---|---|---|
Jan | 1 | Chicago | USW00014819 | 25.6 |
Jan | 1 | San Diego | USW00093107 | 55.2 |
Jan | 1 | Houston | USW00012918 | 53.9 |
Jan | 1 | Death Valley | USC00042319 | 51.0 |
Jan | 2 | Chicago | USW00014819 | 25.5 |
Jan | 2 | San Diego | USW00093107 | 55.3 |
Jan | 2 | Houston | USW00012918 | 53.8 |
Jan | 2 | Death Valley | USC00042319 | 51.2 |
Jan | 3 | Chicago | USW00014819 | 25.3 |
Jan | 3 | San Diego | USW00093107 | 55.3 |
Jan | 3 | Death Valley | USC00042319 | 51.3 |
Jan | 3 | Houston | USW00012918 | 53.8 |
2. 比例尺:将数据映射到图形元素
想实现将数据映射到图形元素,首先需要指定哪些数据类别对应到图形元素哪些特征。举个例子,如果图形上有 x 轴,那我们就需要考虑指定哪些数据分布在坐标轴上的不同位置(position),类似的,我们还要考虑哪些数据来对应到特定的形状(shape)和颜色(color),这种数据和图形元素之间的对应关系就是通过比例尺(scale) 来创建的。比例尺定义了数据和图形元素之间一一映射关系。也就是说,比例尺是一对一的,对于每一个数据集,都只能是一个图形元素特征,反之亦然。如果比例尺不是一一对应的,数据可视化就会变得模糊不清。
图片 2.2:比例尺连接数据集到图形元素。图上数字 1 到 4 分别建立了和位置(position)、形状(shape)、颜色(color)的映射关系。在每个比例尺上,每个数据都对应一个唯一的图形特征,反之亦然。
我们再来看实际一点的,以 表格2.2 数据为例,我们可以分别将 month 和 temperature 映射到 x 轴和 y 轴上。而 location 则作为颜色分类,并生成实线线段。最终生成的效果就是标准的折线图,展示 4 个城市在一年不同月份的温度趋势图。
图 2.3:4个城市的温度趋势折线图,x 轴代表月份,y 轴代表温度,而颜色用来区分不同城市
图 2.3 是非常常见的用于展示温度趋势的折线图,也是大部分数据科学家凭直觉就会选择的可视化实现。然而,我们也可以指定不同变量来生成不同比例尺。举例来说,相比于将 temperature 映射到 y 轴,location 映射为颜色,我们可以反着来。此时我们关心的关键变量(temperature)就通过颜色来呈现,我们需要定义更大的颜色范围来传递更有价值的信息。此时,我会选择用正方块来替换折线,一个色块对应一个城市和月份,下图我按照每月的平均温度进行对色块的着色。
图 2.4:此时 x 轴还是月份,但是 y 轴变成了城市,而颜色通过温度来区分
我要强调一下,图 2.4 上有两种基于位置的比例尺,分别是基于 x 轴分布的 month,和基于 y 轴分布的 location,且两者都不是连续型变量。其中 Month 是有序因子并包含 12 个级别(level), 而 Location 是 4 个层级的无序因子,两者都是离散型比例尺。离散型数据的因子通常在坐标轴上等间距分布,如果是有序的(比如 Month),则会按照适当的顺序分布,如果是无序的(比如 Location),那么可以按照需求自由分布。图 2.4,我按照从冷(Chicago)到热(Death Valley)生成一个渐变效果,当然我也可以采用其他的排序方式。
图 2.3 和图 2.4 都应用了 3 个比例尺 —— 2 个基于位置的比例尺和 1 个基于颜色的比例尺,这是可视化图形的常用比例尺数量,当然我们也可以应用更多的比例尺数量。图 2.5 上就应用了 5 个比例尺 —— 2 个位置比例尺,1 个 颜色比例尺,1 个尺寸比例尺和 1 个形状比例尺,每个比例尺都代表了数据的不同维度。
图 2.5: 汽车燃油效率与排量之比。图上应用了 5 个维度来展示数据。(i) x轴(发动机排量); (ii) y 轴(燃油机效率); (iii) 点颜色(功率); (iv) 点尺寸(汽车重量); (v) 点的形状(气缸数量); 4/5 的维度(排量、效率、功率、重量)是连续型数据,只有剩下的气缸数量字段可以认为是离散型数字,或是定性有序类型。