数据可视化基础

  1. 1. 数据可视化概述
    1. 1.1. 什么是数据可视化
    2. 1.2. 为什么要数据可视化
    3. 1.3. 数据可视化的目的
    4. 1.4. 数据可视化的作用
    5. 1.5. 数据可视化的发展史
  2. 2. 数据可视化基础
    1. 2.1. 视觉感知
    2. 2.2. 视觉认知
    3. 2.3. 视觉感知的处理过程
    4. 2.4. 格式塔原则
    5. 2.5. 三基色原理
    6. 2.6. 视觉编码
    7. 2.7. 可视化编码
    8. 2.8. 视觉通道
    9. 2.9. 数据类型
    10. 2.10. 数据预处理
    11. 2.11. 代表性可视化方法
  3. 3. 时间数据可视化
  4. 4. 数据可视化方式
    1. 4.1. 折线图
    2. 4.2. 柱状图
    3. 4.3. 条形图
    4. 4.4. 堆积图
    5. 4.5. 直方图
    6. 4.6. 柱状图与直方图的区别
    7. 4.7. 箱形图
    8. 4.8. 饼图
    9. 4.9. 散点图
  5. 5. MPL可视化库
    1. 5.1. 使用pyplot的plot()函数可以快速地绘制折线图
    2. 5.2. 使用pyplot的bar()函数可以快速地绘制柱形图或堆积柱形图
    3. 5.3. 使用pyplot的barh()函数可以快速地绘制条形图或堆积条形回
    4. 5.4. 使用pyplot的stackplot()函数可以快速地绘制堆积面积图。
    5. 5.5. 使用pyplot的hist()函数可以快速地绘制直方图。
    6. 5.6. 使用pyplot的pie()函数可以快速地绘制饼图或园环图
    7. 5.7. 使用pyplot的scatter()函数可以快速地绘制散点图或泡图。
    8. 5.8. 使用pyplot的boxplot()函数可以快速地绘制箱形图。
  6. 6. 辅助元素
    1. 6.1. 使用pyplot模块的xlabel()函数可以设置x轴的标签。
    2. 6.2. 使用pyplot模块的ylabel()函数可以设置y轴的标签。
    3. 6.3. 使用pyplot模块的xlim()和ylim()函数分别可以设置或获取x轴和y轴的刻度范围。
    4. 6.4. 使用pyplot模块的xticks()或yticks()函数可以设置x轴或y轴的刻度线位置和刻度标签。
    5. 6.5. 使用pyplot模块的title()函数可以添加图表标题。
    6. 6.6. 使用pyplot模块的legend()函数可以为图表添加图例。
    7. 6.7. 使用pyplot模块的grid()函数可以显示图表中的网格。
    8. 6.8. 使用pyplot模块的axhline()函数可以为图表添加水平参考线。
    9. 6.9. 使用pyplot模块的axvline()函数可以为图表添加垂直参考线。
  7. 7. 图表样式的美化
    1. 7.1. 线条类型
    2. 7.2. 数据标记
    3. 7.3. 绘制子图

数据可视化概述

什么是数据可视化

在计算机视觉领域,数据可视化是对数据的一种形象直观的解释,实现从不同维度观察数据,从而得到更有价值的信息。
数据可视化将抽象的、复杂的、不易理解的数据转化为人眼可识别的图形、图像、符号、颜色、纹理等,这些转化后的数据通常具备较高的识别效率,能够有效地传达出数据本身所包含的有用信息。
比起枯燥冰冷的数据,人类对于大小、位置、形状、颜色深浅等能够更好、更快的认识。
经过可视化之后的数据能够加深人们对于数据的理解和记忆。

为什么要数据可视化

要想探索和理解那些大型的数据集,可视化是最有效的途径之一。
数据可视化能够在小空间中展示大规模数据

数据可视化的目的

数据可视化的目的,是对数据进行可视化处理,以使得能够明确地、有效地传递信息。
数据可视化是为了从数据中寻找三种信息:模式、关系和异常

  • 模式,指数据中的规律。
  • 关系,指数据之间的相关性
  • 异常,指有问题的数据

数据可视化的作用

  • 记录信息
  • 分析推理
  • 信息传播与协同

数据可视化的发展史

  1. 图表萌芽
  2. 物理测量
  3. 图形符号
  4. 数据图形
  5. 可视化的现代启蒙
  6. 多维信息的可视编码
  7. 多维统计图形
  8. 交互可视化
  9. 可视分析学

数据可视化基础

视觉感知

视觉感知是人类大脑的最主要功能之一。
眼睛是人体的视觉感知器官, 它有着接收及分析视像的高级能力,最高带宽可达2.3GB/s
人脑功能的50%用于对视觉感知所得信息的处理

视觉感知是指客观事物通过人的视觉器官在人脑中形成的直接反映。
视觉感知是视觉的内在表象,它包括视觉低级和视觉高级两个不同的感知层次。
视觉的低级感知层次与物体性质相关,包括深度、形状、边界、表面材质等。
视觉高级感知层次包括对物体的识别和分类,属于人类的认知能力的重要组织部分。

视觉认知

人类只有通过“视觉感知”才能达到“视觉认知”。
也就是说,视觉感知的进一步就是视觉认知。
视觉认知是把视觉感知的信息加以整合、解释、赋以意义的心理活动,是关于怎样理解和解释所观察到的客观事物的过程。
视觉认知过程是先由眼睛接受信息,感知信息后再将感知变为知觉,然后进行知觉的整合。
所以说,“视觉感知”是“视觉认知”的前提。
视觉认知过程中还有记忆、理解、判断、推理等因素。

视觉感知的处理过程

  1. 视觉寻找:是指在视线所能达到的范围内搜寻目标。
  2. 寻找:是当发现视觉探测到的对象与预期所需目标相符合时,则排除其他对象,锁定目标。
  3. 分辨:是指对多个相似的对象的信息进行深入探测。
  4. 识别:是指根据视觉特征信息和细节信息的差异,识别目标的含义。
  5. 确定:是指锁定的对象与记忆中的存储信息相吻合,确认目标。
  6. 记忆搜索:是以上视觉过程的基础,以上视觉所获得的信息都要与记忆信息对比,然后做出判断。

格式塔原则

视觉感知的格式塔原则为图形和用户界面设计准则提供了有用的基础。
格式塔心理学诞生于1912年,是心理学中位数不多的理性主义理论之一。
它强调经验和行为的整体性,认为感知的事务大于眼睛见到的事物。
格式塔心理学感知理论最基本的法则是简单提炼法则,认为人们在进行观察的时候,倾向于将视觉感知内容理解为常规的、简单的、相连的、对称的或有序的结构。同时,人们在获取视觉感知的时候,会倾向于将食物理解为一个整体,而不是将事物理解为组成该事物所有部分的集合。

三基色原理

自然界中的绝大部分彩色,都可以由三种基色按一定比例混合得到;反之,任意一种彩色均可被分解为三种基色。
作为基色的三种彩色,要相互独立,即其中任何一种基色都不能由另外两种基色混合来产生。
由三基色混合而得到的彩色光的亮度等于参与混合的各基色的亮度之和。
三基色的比例决定了混合色的色调和色饱和度。

视觉编码

描述数据与可视化结果的映射关系。我们把可视化看成一组图形符号的组合,这些图形符号中携带了被编码的信息。
而当人们从这些符号中读取相应的信息时,就称之为解码。
可视化编码是信息可视化的核心内容,是将数据信息映射成可视化元素的技术,其通常具有表达直观,易于理解和记忆等特性。

可视化编码

可视化编码由标记(图形元素)和视觉通道两部分组成,标记和用于控制标记的视觉特征的视觉通道。二者的结合可以完整地对数据信息进行可视化表达。

  1. 标记通常是一些几何图形元素:如点、线、面、体等。
  2. 视觉通道用于控制标记的视觉特征,通常可用的视觉通道包括标记的颜色、位置、尺寸、形状、方向、色调、饱和度、亮度、纹理等。

视觉通道

  1. 定性或分类的视觉通道:适合用于编码分类的数据信息,如形状、颜色
  2. 定量或定序的视觉通道:适合用于编码有序的或者连续型的数据信息,如直线的长度、区域面积、空间的体积、斜度、角度、颜色的饱和度和亮度等。
  3. 分组的视觉通道:分组是对多个或多种标记的组合来进行描述的。分组通道包括接近性、相似性和包括性。分组通道适合将存在相互联系的分类的数据进行分组,以此来表现数据内在的关联性。

数据类型

  1. 类别型数据:用于区分物体。例如,根据性别可以将人分为男性或者女性;商品可按用途、原材料、生产方法、化学成分、使用状态等方面进行不同的分类。这些类别可以用来区分一组对象。
  2. 有序型数据:用来表示对象间的顺序关系。比如成绩排名,身高排序等。
  3. 区间型数据:用于得到对象间的定量比较,相对于有序型数据,区间型数据提供了详细的定量信息。例如,身高 160cm 与身高 170cm 相差 10cm,而 170cm 与 180cm 也相差 10cm,它们俩的差值是相等的。由此可见,区间型数据基于任意的起始点,所以它只能衡量对象间的相对差别。
  4. 比值型数据:用于比较数值间的比例关系,可以精确地定义比例。比如,2班的学生是1班的2倍(2:1)。

数据预处理

  1. 数据清理:指修正数据中的错误、识别脏数据、更正数据不一致的过程。其中涉及到的技术有不一致性检测技术、脏数据识别技术、数据过滤技术、数据修正技术、数据噪声的识别与平滑技术等。
  2. 数据整合:指把来自不同数据源的同类数据进行合并,减少数据冲突,降低数据冗余程度等。
  3. 数据变换:指对数据进行规范化处理。数据转换处理技术包括基于规则或元数据的转换技术、基于模型和学习的转换技术等。
  4. 数据归约:是指在保证数据挖掘结果准确性的前提下,最大限度地精简数据量,得到简化的数据集。数据归约技术包括维归约技术、数值归约技术、数据抽样技术等。数据归约技术可以用来得到数据集的归约表示,它虽然小,但会保持原数据的完整性。这样,在归约后的数据集上挖掘也会产生相同(或几乎相同)的分析结果。

代表性可视化方法

  • 数据轨迹:数据轨迹是一种标准的单变量数据呈现方法:x轴显示自变量,y轴显示因变量。数据轨迹可直观地呈现数据分布、离群值、均值的偏移等
  • 柱状图:柱状图采用长方形的形状和颜色编码数据的属性。柱状图的每根直柱内部也可以用像素图方式编码,称为堆叠图。柱状图适用于二维数据集,但只有一个维度需要比较,柱状图利用柱子的高度,反应数据的差异。柱状图的局限在于只适用于中小规模的数据集。
  • 折线图:拆线图适用于二维大数据集,尤其是那些趋势比单个数据点更重要的场合。折线图还适用于多个二维数据集的比较。
  • 直方图:直方图是对数据集的某个数据属性的频率统计,对于单变量数据,其取值范围映射到横轴,并分割为多个子区间。每个子区间用一个直立的长方块表示,高度正比于属于该属性值子区间的数据点的个数。直方图可以呈现数据的分布、离群值和数据分布的模态,直方图的各个部分之和等于单位整体,而柱状图的各个部分之和没有限制,这是两者的主要区别。
  • 饼图:饼图采用环状方式呈现各分量在整体中的比例。这种分块方式是环状树图等可视表达的基础。饼图很多时候应该尽量避免使用,因为肉眼对面积的大小不敏感。一般情况下,应用柱状图替代饼图,但是有一个例外,就是反映某个部分占整体的比例。
  • 等值线图:等值线图使用相等数值的数据点连线来表示数据的连续分布和变化规律。等值线图中的曲线是空间中具有相同数值(高度、深度等)的数据点在平面上的投影。
  • 走势图:走势图是一种紧凑简洁的数据趋势表达方式,它通常以折线图为基础,往往直接嵌入在文本或表格中。走势图使用高度密集的折线图表达方式来展示数据随某一变量(时间、空间)的变化趋势。
  • 散点图:散点图是表示二维数据的标准方法。在散点图中,所有数据以点的形式出现在笛卡儿坐标系中,每个点所对应的横纵坐标代表该数据在坐标轴上的属性值大小。散点图适用于三维数据集,但其中只有两维需要比较。为了识别第三维,可以为每个点加上文字标识,或者不同的颜色。
  • 气泡图维恩图:气泡图是散点图的一种变形,通过每个点的面积大小来表示第三维。如果为气泡图加上不同颜色(或者文字标签),气泡图就可以用来表示四维数据。
  • 热力图:热力图使用颜色来表达位置相关的二维数值数据大小。这些数据常以矩阵或方格形式排列,或在地图上按一定位置关系排列,每个数据点可以使用颜色编码数值的。
  • 雷达图:雷达图又可称为戴布拉图、蜘蛛网图(Spider Chart)。适用于多维数据(四维以上),且每个维度必须可以排序。

时间数据可视化

时间型数据:按时间顺序排列的一系列数据值。
与一般的定量数据不同,时间型数据包含时间属性,不仅要表达数据随时间变化的规律,还需表达数据分布的时间规律。
时间数据可以分为连续型时间数据和离散型时间数据两种。下面讲述下连续性和离散型时间数据的可视化。

  • 连续型数据:连续型数据就是指任意两个数据点之间可以细分出无限多个数值,它表现的是不断变化的现象。
  • 离散型数据:离散数据又称为不连续数据,这类数据在任何两个数据点之间的个数是有限的。

数据可视化方式

折线图

折线图是将数据标注成点,并通过直线将这些点按某种顺序连接而成的图表,它以折线的倾斜程度来形象地反映事物沿某-维度的变化趋势,能够清晰地展示数据增减的趋势、速率、规律及峰值等特征。

柱状图

柱形图是由一系列宽度相等的纵向矩形条组成的图表,它使用矩形条的高度表示数值,以此反映不同分类数据之间的差异。

条形图

条形图是横置的柱形图,由一系列高度相等、长短不一的横向矩形条组成

堆积图

堆积面积图是由若干条折线与折线或水平坐标轴之间的地充区域组成的图表,用于强调每个部分变化的趋势;堆积柱形图和堆积条形图是由若干个以颜色或线条填充、高度不一的纵向矩形条或横向矩形条堆叠而成的图表,主要用于反映各构成部分在总体中的此重

直方图

直方图又称质量分布图,是由一系列高低不等的纵向矩形条或线段组成的图表,用于反映数据的分布和波动情况。

柱状图与直方图的区别

柱形图与直方图的区别包括以下两点:

  • 柱形图用于展示离散型数据的分布,而直方图用于展示连续型数据的分布;
  • 柱形图的各矩形条之间具有固定的间隙,而直方图的各矩形条之间没有任何间隙。

箱形图

箱形图又称盒须图、箱线图,是一种利用数据中的5个统计量一最小值、下四分位数、中位数、上四分位数和最大值一描述数据的图表,主要用于反映一组或多组数据的对称性、分布程度等信息,因形状如箱子而得名。

饼图

饼图是由若干个面积大小不一、颜色不同的扇形组成的圆形图表,它使用圆表示数据的总量,组成圆的每个扇形表示数据中各项占总量的比例大小,主要用于显示数据中各项大小与各项总和的比例。

散点图

散点图又称X-Y图,是由若F个数据点组成的图表,主要用于判断两变量之间是否存在某种关联,或者总结数据点的分布模式。

MPL可视化库

使用pyplot的plot()函数可以快速地绘制折线图

1
plot(x, y, label=None, *args, **kwargs) 
  • x:表示x轴的数据,默认值为range(len(y))。
  • y:表示y轴的数据。
  • label:表示应用于图例的标签文本。

使用pyplot的bar()函数可以快速地绘制柱形图或堆积柱形图

1
bar(x, height, width=0.8, bottom=None, align=‘center’, tick_label=None, xerr=None, yerr=None, **kwargs)
  • x:表示柱形的x坐标值。
  • height:表示柱形的高度。
  • width:表示柱形的宽度,默认为0.8。
  • bottom:表示柱形底部的y值,默认为0。
  • tick_label:表示柱形对应的刻度标签。
  • xerr,yerr :若未设为None,则需要为柱形图添加水平/垂直误差棒。

使用pyplot的barh()函数可以快速地绘制条形图或堆积条形回

1
barh(y, width, height=0.8, left=None, align='center', *, **kwargs) 
  • y:表示条形的y值。
  • width:表示条形的宽度。
  • height:表示条形的高度,默认值为0.8。
  • left:条形左侧的x坐标值,默认值为0。
  • align:表示条形的对齐方式,默认值为“center”,即条形与刻度线居中对齐。
  • tick_label:表示条形对应的刻度标签。
  • xerr,yerr:若未设为None,则需要为条形图添加水平/垂直误差棒。

使用pyplot的stackplot()函数可以快速地绘制堆积面积图。

1
stackplot(x, y,labels=(),data=None, *args, **kwargs) 
  • x:表示x轴的数据,可以是一维数组。
  • y:表示y轴的数据,可以是二维数组或一维数组序列。
  • labels:表示每个填充区域的标签。

使用pyplot的hist()函数可以快速地绘制直方图。

1
2
hist(x, bins=None, range=None, density=None, weights=None, 
bottom=None,  **kwargs)
  • x:表示x轴的数据。
  • bins:表示矩形条的个数,默认为10。
  • range:表示数据的范围,若未设置范围,默认数据范围为(x.min(), x.max())。
  • cumulative:表示是否计算累计频数或频率。
  • histtype:表示直方图的类型,持’bar’、’barstacked’、’step’、’stepfilled‘四种取值,其中’bar’为默认值,代表传统的直方图;’barstacked’代表堆积直方图;’step’代表未填充的线条直方图;’stepfilled’代表填充的线条直方图。
  • align:表示矩形条边界的对齐方式,可设置为’left’、’mid’或’right’,默认为’mid’。
  • orientation:表示矩形条的摆放方式,默认为’vertical’,即垂直方向。
  • rwidth:表示矩形条宽度的百分比,默认为0。若histtype的值为’step’或’stepfilled’,则直接忽略rwidth参数的值。
  • stacked:表示是否将多个矩形条以堆叠形式摆放。

使用pyplot的pie()函数可以快速地绘制饼图或园环图

1
2
pie(x, explode=None, labels=None, autopct=None, pctdistance=0.6, 
startangle=None, *, data=None)
  • x:表示扇形或楔形的数据。
  • explode:表示扇形或楔形离开圆心的距离。
  • labels:表示扇形或楔形对应的标签文本。
  • autopct:表示控制扇形或楔形的数值显示的字符串,可通过格式字符串指定小数点后的位数。
  • pctdistance:表示扇形或楔形对应的数值标签距离圆心的比例,默认为0.6。
  • shadow:表示是否显示阴影。
  • labeldistance:表示标签文本的绘制位置(相对于半径的比例),默认为1.1。
  • startangle:表示起始绘制角度,默认从x轴的正方向逆时针绘制。
  • radius:表示扇形或楔形围成的圆形半径。
  • wedgeprops:表示控制扇形或楔形属性的字典。例如,通过wedgeprops = {‘width’: 0.7} 将楔形的宽度设为0.7。
  • textprops:表示控制图表中文本属性的字典。
  • center:表示图表的中心点位置,默认为(0,0)。
  • frame:表示是否显示图框。

使用pyplot的scatter()函数可以快速地绘制散点图或泡图。

1
scatter(x, y, s=None, c=None, marker=None, cmap=None, linewidths=None, edgecolors=None, *, **kwargs) 
  • x,y:表示数据点的位置。
  • s:表示数据点的大小。
  • c:表示数据点的颜色。
  • marker:表示数据点的样式,默认为圆形。
  • alpha:表示透明度,可以取值为0~1。
  • linewidths:表示数据点的描边宽度。
  • edgecolors:表示数据点的描边颜色。

使用pyplot的boxplot()函数可以快速地绘制箱形图。

1
boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, *, data=None)
  • x:绘制箱形图的数据。
  • sym:表示异常值对应的符号,默认为空心圆圈。
  • vert:表示是否将箱形图垂直摆放,默认为垂直摆放。
  • whis:表示箱形图上下须与上下四分位的距离,默认为1.5倍的四分位差。
  • positions:表示箱体的位置。
  • widths:表示箱体的宽度,默认为0.5。
  • patch_artist:表示是否填充箱体的颜色,默认不填充。
  • meanline:是否用横跨箱体的线条标出中位数,默认不使用。
  • showcaps:表示是否显示箱体顶部和底部的横线,默认显示。
  • showbox:表示是否显示箱形图的箱体,默认显示。
  • showfliers:表示是否显示异常值,默认显示。
  • labels:表示箱形图的标签。
  • boxprops:表示控制箱体属性的字典。

辅助元素

使用pyplot模块的xlabel()函数可以设置x轴的标签。

1
xlabel(xlabel, fontdict=None, labelpad=None, **kwargs)
  • xlabel:表示x轴标签的文本。
  • fontdict:表示控制标签文本样式的字典。
  • labelpad:表示标签与x轴轴脊间的距离。

使用pyplot模块的ylabel()函数可以设置y轴的标签。

1
ylabel(ylabel, fontdict=None, labelpad=None, **kwargs)
  • ylabel:表示y轴标签的文本。
  • fontdict:表示控制标签文本样式的字典。
  • labelpad:表示标签与y轴轴脊的距离。

使用pyplot模块的xlim()和ylim()函数分别可以设置或获取x轴和y轴的刻度范围。

1
xlim(left=None, right=None,  emit=True, auto=False, *, xmin=None, xmax=None)  
  • left:表示x轴刻度取值区间的左位数。
  • right:表示x轴刻度取值区间的右位数。
  • emit:表示是否通知限制变化的观察者,默认为True。
  • auto:表示是否允许自动缩放x轴,默认为True。

使用pyplot模块的xticks()或yticks()函数可以设置x轴或y轴的刻度线位置和刻度标签。

1
xticks(ticks=None, labels=None, **kwargs)  
  • ticks:表示刻度显示的位置列表,该参数可以设置为空列表,以此禁用x轴的刻度。
  • labels:表示指定位置刻度的标签列表。

使用pyplot模块的title()函数可以添加图表标题。

1
title(label, fontdict=None, loc=‘center’, pad=None, **kwargs) 
  • label:表示标题的文本。
  • fontdict:表示控制标题文本样式的字典。
  • loc:表示标题的对齐样式。
  • pad:表示标题与图表顶部的距离,默认为None。

使用pyplot模块的legend()函数可以为图表添加图例。

1
legend(handles, labels, loc, bbox_to_anchor, ncol, title, shadow, fancybox, *args, **kwargs) 
  • handles:表示由图形标识构成的列表。
  • labels:表示由图例项构成的列表。
  • loc:用于控制图例在图表中的位置。
  • ncol:表示图例的列数,默认值为1。
  • title:表示图例的标题,默认值为None。
  • shadow :表示是否在图例后面显示阴影,默认值为None。
  • fancybox:表示是否为图例设置圆角边框,默认值为None

使用pyplot模块的grid()函数可以显示图表中的网格。

1
grid(b=None, which='major', axis='both', **kwargs) 
  • b:表示是否显示网格。
  • which:表示显示网格的类型,默认为major。
  • axis:表示显示哪个方向的网格,默认为both。
  • linewidth 或 lw:网格线的宽度。

使用pyplot模块的axhline()函数可以为图表添加水平参考线。

1
axhline(y=0, xmin=0, xmax=1, linestyle='-', **kwargs) 
  • y:表示水平参考线的纵坐标。
  • xmin:表示水平参考线的起始位置,默认为0。
  • xmax:表示水平参考线的终止位置,默认为1。
  • linestyle:表示水平参考线的类型,默认为实线。

使用pyplot模块的axvline()函数可以为图表添加垂直参考线。

1
axvline(x=0, ymin=0, ymax=1, linestyle='-', **kwargs) 
  • x:表示垂直参考线的横坐标。
  • ymin:表示垂直参考线的起始位置,默认为0。
  • ymax:表示垂直参考线的终止位置,默认为1。
  • linestyle:表示垂直参考线的类型,默认为实线。

图表样式的美化

线条类型

短虚线、点划线、长虚线和实线

在使用pyplot绘制折线图、显示网格或添加参考线时,可以将线型取值传递给linestyle或ls参数,以选择其它的线条类型。

1
2
plt.plot([1, 2, 3], [3, 4, 5], linestyle='--')
plt.plot([1, 2, 3], [3, 4, 5], ls='--')

数据标记

数据标记可以分为填充型数据标记和非填充型数据标记。

将标记取值传递给marker参数

1
plt.plot([1, 2, 3], [3, 4, 5], marker='*')

绘制子图

使用pyplot模块的subplot()函数可以在规划好的某个区域中绘制单个子图。