第5讲:数据可视化

数据可视化

导入:为什么要学习数据可视化

在前一讲中,我们已经讨论了数据分类、数据清洗和数据变换等内容。经过清洗与整理之后,数据已经从“原始、杂乱、不可直接分析”的状态,逐步转变为“结构化、规范化、可用于建模”的状态。但即便如此,如果我们不能把数据中的规律、差异和关系直观地表达出来,那么数据分析的价值仍然难以真正传递。

这就是数据可视化的重要性所在。所谓数据可视化,就是借助图形、颜色、位置、大小、形状等视觉编码方式,把抽象的数据转化为人们更容易感知、理解和解释的信息。与单纯的表格和数字相比,图形能够更快地揭示分布特征、变化趋势、变量关系和异常结构,因此是数据分析中不可替代的重要工具。

从数据科学的流程来看,数据可视化至少具有以下几方面作用:

  1. 帮助探索数据。在正式建模之前,通过可视化可以快速了解数据分布、变量关系、是否存在异常值以及是否有明显偏态。
  2. 帮助发现规律。很多统计关系并不是先通过公式发现的,而是先通过图形观察到趋势,再进一步进行建模和检验。
  3. 帮助验证分析结果。模型得到结论后,往往还需要借助图形进行解释和检验,例如残差图、拟合图、分类结果图等。
  4. 帮助沟通与表达。数据分析不仅是技术过程,也是结果传达过程。图形比公式和表格更容易让非专业受众理解研究发现。
  5. 帮助辅助决策。无论是在商业分析、媒体传播、公共管理还是科研写作中,可视化都是将数据转化为决策依据的重要桥梁。

因此,可以说:数据可视化不仅是“把数据画出来”,更是把数据背后的结构、规律与结论表达出来。

DEMO

南丁格尔玫瑰图

  • 南丁格尔玫瑰图是经典的数据可视化案例之一。它不仅展示了数据大小,还通过角度与面积的变化强化了比较效果,说明图形不仅具有展示功能,也具有解释与传播功能。

图形初阶

一个例子

  • 病人 A 和 B 对两种药物五个剂量水平上的响应情况。
dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)
plot(dose, drugA, type="b")

```{r, fig.width=8} dose <- c(20, 30, 40, 45, 60) drugA <- c(16, 20, 27, 40, 60) drugB <- c(15, 18, 25, 31, 40) plot(dose, drugA, type=”b”)


* 这个例子说明:当我们想展示“剂量变化是否会带来药物响应变化”时,图形往往比简单的数值表更容易帮助我们观察趋势。图形的首要作用,就是帮助我们快速建立对数据整体结构的直观认识。

## 图形参数

```{r,fig.width=4.5, fig.height=3}
opar <- par(no.readonly=TRUE)
par(lty=2, pch=17)#线条类型和点符号
plot(dose, drugA, type="b")
par(opar)

图形属性

  • 颜色参数:colcol.axiscol.labcol.maincol.subfgbg
  • 文本属性:cexcex.axiscex.main
  • 字体属性:fontfont.axisfont.labfont.main
  • 例如:par(font.lab=3, cex.lab=1.5, font.main=4, cex.main=2)
  • 图形尺寸:
    1. pin:以英寸表示的图形尺寸(宽和高)
    2. mai:以数值向量表示的边界大小,顺序为“下、左、上、右”,单位为英寸
    3. mar:以数值向量表示的边界大小,顺序为“下、左、上、右”,默认值为 c(5, 4, 4, 2) + 0.1
  • 这部分说明,一个图形是否“好看”只是次要的,更重要的是图形是否清晰、是否便于比较、是否能够准确传递信息。图形参数的设置,本质上是在优化图形的可读性。

添加文本、自定义坐标轴和图例

plot(dose, drugA, type="b", col="red", lty=2, pch=2, lwd=2,
main="Clinical Trials for Drug A",sub="This is hypothetical data",
xlab="Dosage", ylab="Drug Response",xlim=c(0, 60), ylim=c(0, 70))

添加文本、自定义坐标轴和图例

  • 标题:title()
  • 坐标轴:axis()
  • 参考线:abline()
  • 图例:legend()
  • 文本标注:text()
  • 数学标注:plotmath()demo(plotmath)

图形组合

  • 函数:par()par(mfrow=c(2,2))
attach(mtcars)
opar <- par(no.readonly=TRUE)
par(mfrow=c(2,2))
plot(wt, mpg, main="Scatterplot of wt vs. mpg")
plot(wt, disp, main="Scatterplot of wt vs. disp")
hist(wt, main="Histogram of wt")
boxplot(wt, main="Boxplot of wt")
  • 图形组合的作用是把多个视角放在同一页面中共同观察。这样可以同时看分布、关系与异常,有利于形成对数据更完整的理解。

数据可视化的重要性

可视化在数据科学中的角色

如果把数据科学看作一个完整流程,那么可视化几乎贯穿始终:

  • 数据获取后,可视化帮助我们快速认识数据结构;
  • 数据清洗时,可视化帮助识别异常值、缺失模式和分布偏态;
  • 建模之前,可视化帮助判断变量关系、发现潜在假设;
  • 建模之后,可视化帮助展示结果、验证模型和解释结论;
  • 结果传播中,可视化帮助把复杂分析转化为直观表达。

从这个意义上说,数据可视化不是分析的附属环节,而是数据分析的核心组成部分。

为什么图形比表格更有力量

表格适合精确查阅数值,但不擅长揭示整体模式;图形虽然不一定能体现每一个精确数值,却特别擅长揭示结构与趋势。比如:

  • 一组收入数据放在表格里,我们很难一眼看出其分布形态;
  • 但画成直方图后,就可以迅速判断其是否偏态、是否多峰;
  • 两个变量的几十组观测值放在表格里,很难看出关系;
  • 但画成散点图后,线性关系、非线性关系、聚类结构和异常点往往立刻显现。

因此,图形的优势并不在于取代表格,而在于帮助我们更高效地理解表格中隐藏的信息。

一个好的可视化应当满足什么要求

一个有效的数据可视化,通常至少应当满足以下要求:

  1. 准确:图形必须忠实于数据,不能误导读者。
  2. 清晰:图形元素要简洁,重点突出,便于识别。
  3. 匹配问题:不同分析目的要选择不同图形,不能“为画图而画图”。
  4. 便于比较:优秀图形应能帮助读者快速完成组间比较、时间比较或结构比较。
  5. 服务表达:图形不仅要展示,还要支持解释和结论传达。

因此,学习数据可视化并不仅仅是学习函数怎么调用,更重要的是学会“面对一种数据和一种问题时,应该选择什么图,为什么这么画”。

常见图形汇总

按分析目的分类

从分析目的出发,常见的数据可视化图形大致可以分为以下几类:

  1. 展示分类数据分布:条形图、饼图、扇形图
  2. 展示连续变量分布:直方图、核密度图、箱线图、小提琴图
  3. 展示两个变量关系:散点图、气泡图、折线图
  4. 展示多个变量关系:散点图矩阵、热力图、平行坐标图
  5. 展示时间变化趋势:折线图、面积图
  6. 展示组成结构:堆积条形图、饼图、环形图、树图
  7. 展示空间分布:地图、热区图、地理气泡图
  8. 展示高维数据模式:降维散点图、聚类热图、网络图

这个分类方式非常重要。因为图形的选择,不应该只看“我会不会画”,而应该先问“我想展示什么”。

按数据类型分类

从数据类型角度,也可以大致归纳为:

  • 分类变量:条形图、饼图、马赛克图
  • 连续变量:直方图、密度图、箱线图
  • 时间序列数据:折线图、面积图
  • 二维连续变量关系:散点图、二维密度图
  • 多变量数据:散点图矩阵、热力图、雷达图

基本图形

条形图

  • 条形图通过垂直或水平条形展示类别型变量的分布(频数或频率)。
  • barplot() 的最简单用法是:barplot(height)
  • 条形图特别适合比较不同类别的大小差异,因此在调查数据、媒体数据和分类统计中非常常见。

堆砌条形图和分组条形图

条形图的适用场景

  • 比较不同专业学生人数
  • 比较不同平台用户规模
  • 比较不同地区样本量
  • 展示问卷选项的频数分布

  • 当重点在“类别之间谁多谁少”时,条形图通常是最优先考虑的图形之一。

箱线图

  • 箱线图(又称盒须图)通过绘制连续型变量的五数总括,即最小值、下四分位数、中位数、上四分位数以及最大值,描述连续型变量的分布。
  • 箱线图能够显示出可能的离群点,即超出 ±1.5×IQR 范围之外的观测值。
  • 箱线图特别适合比较不同组之间的中位数、离散程度和异常值情况。

箱线图

boxplot(mpg ~ cyl, data=mtcars, main="Car Mileage Data",
xlab="Number of Cylinders", ylab="Miles Per Gallon")

箱线图的适用场景

  • 比较不同班级考试成绩分布
  • 比较不同平台停留时长分布
  • 比较不同地区收入水平分布
  • 识别极端值和异常观测

饼图

  • 饼图表示同一变量不同水平所占的比例:pie(x, labels)
  • 其中 x 是非负数值向量,表示各扇形面积;labels 是各扇形标签。
  • 饼图的优点是结构直观,适合展示组成;缺点是当类别过多时不利于精确比较。

饼图

扇形图

  • 扇形图是通过 plotrix 包中的 fan.plot() 函数实现的。
  • 相比普通饼图,扇形图有时能提供更有层次感的视觉效果,但本质上仍然是结构占比图。

扇形图

直方图

  • 直方图用于展示连续型变量的分布情况:hist(x)
  • 它特别适合观察变量的集中程度、离散程度、偏态特征以及是否存在多个峰值。

直方图

核密度图

  • 核密度图是一种观察连续型变量分布的有效方法,绘制方法为:plot(density(x))
  • 与直方图相比,密度图更平滑,更适合观察分布轮廓。

核密度图

点图

  • 点图提供了一种在简单水平刻度上绘制大量有标签值的方法:dotchart(x, labels=)
  • x 是数值向量,labels 是每个点对应的标签。
  • 当类别较多但又希望保留标签时,点图往往比条形图更紧凑。

点图

散点图

  • 散点图用于描述两个连续型变量之间的关系。
  • 它可以帮助我们观察线性关系、非线性关系、聚类趋势和异常点。
  • 在探索性分析中,散点图是最常用的图形之一。

散点图

散点图矩阵

  • 散点图矩阵用于描述多个变量中任意两个连续型变量之间的关系。
  • 它特别适合多变量探索性分析,可以快速了解多个变量之间是否存在相关结构。

散点图矩阵

高密度散点图

  • 当样本量非常大时,普通散点图可能出现点重叠问题,此时可以使用高密度散点图或二维密度图来改善可读性。

高密度散点图

折线图

  • 折线图最适合展示随时间变化的趋势,是时间序列数据分析中的基础图形。
  • 当横轴具有顺序含义,例如年份、月份、日期或剂量水平时,折线图比条形图更能体现变化过程。

面积图与堆积图

  • 面积图常用于展示总量随时间的变化;
  • 堆积面积图和堆积条形图则适合同时展示总量变化与内部结构变化。
  • 这类图形在媒体传播数据、平台运营数据和社会调查数据中非常常见。

热力图

  • 热力图通过颜色深浅来表现矩阵或二维表中数值的大小。
  • 它适合展示相关系数矩阵、词频矩阵、区域强度以及聚类结果。
  • 当变量较多时,热力图比大规模表格更易于识别总体模式。

雷达图

  • 雷达图适合展示一个对象在多个维度上的表现,如综合能力评价、品牌形象比较等。
  • 但由于面积和角度容易造成视觉误差,因此在正式分析中应谨慎使用,更适合做概括性展示。

地图可视化

  • 当数据具有空间属性时,可以通过地图进行可视化。
  • 常见形式包括分级设色地图、点密度地图、气泡地图和热区图。
  • 地图非常适合展示地区差异、空间分布和地理聚集现象。

常见图形与应用场景汇总

图形—数据类型—分析任务对应表

图形类型主要数据类型主要用途
条形图分类变量比较不同类别的频数、频率或均值
饼图/扇形图分类变量展示组成比例
直方图连续变量观察分布形态
核密度图连续变量平滑展示分布轮廓
箱线图连续变量/分组变量比较分布、识别异常值
点图分类+数值紧凑展示多类别数值
散点图两个连续变量观察相关关系与异常点
散点图矩阵多个连续变量多变量探索性分析
折线图时间序列展示趋势变化
面积图时间序列/结构数据展示趋势与组成
热力图矩阵数据/多变量数据展示强弱关系和整体模式
地图空间数据展示地理分布

图形选择的一般原则

在实际分析中,可以遵循一个简单原则:

  • 想看分类比较,优先考虑条形图;
  • 想看分布形态,优先考虑直方图、密度图、箱线图;
  • 想看变量关系,优先考虑散点图;
  • 想看时间变化,优先考虑折线图;
  • 想看空间差异,优先考虑地图;
  • 想看多变量整体模式,优先考虑热力图、散点图矩阵。

也就是说,图形选择的关键不在于“哪种图更漂亮”,而在于“哪种图更适合当前问题”。

ggplot2

ggplot2 包含以下几个概念

  • 数据(Data)和映射(Mapping)
  • 标度(Scale)
  • 几何对象(Geometric)
  • 统计变换(Statistics)
  • 坐标系统(Coordinate)
  • 图层(Layer)
  • 分面(Facet)

ggplot2

  • 数据(Data)和映射(Mapping):回答“使用什么数据,以及变量映射到哪些视觉元素上”。
  • 标度(Scale):控制映射后图形属性的显示方式,例如坐标刻度和图例。
  • 几何对象(Geometric):指图中实际看到的几何元素,如点、线、柱、面等。
  • 统计变换(Statistics):对原始数据进行统计计算,例如回归线、置信区间、计数等。
  • 分面(Facet):把数据按某种方式分组后分别绘图,适合做条件比较。

为什么要学习 ggplot2

与基础绘图系统相比,ggplot2 更强调“图形语法”。也就是说,图不再只是靠一个函数一次性画出来,而是把图形分解成数据、映射、图层、几何对象和标度等多个部分,再逐步组合。这种方式非常适合复杂可视化任务,也更符合现代数据分析的工作习惯。

ggplot2 图书推荐

ggplot2:数据分析与图形艺术 第2版

实际应用中的可视化提醒

做图时应避免的问题

  1. 图形元素过多,导致读者抓不住重点;
  2. 颜色过于复杂,反而削弱比较效果;
  3. 纵轴截断不合理,造成视觉误导;
  4. 图形类型与数据不匹配;
  5. 把装饰性置于信息表达之前。

可视化不是装饰,而是分析

在很多初学者看来,数据可视化似乎只是报告最后的“美化步骤”。但实际上,真正好的可视化并不是装饰,而是分析过程本身。一个图形如果不能帮助发现问题、解释问题或支持结论,那么即使再精美,也不算高质量的数据可视化。

#

本讲围绕数据可视化展开,从图形初阶入手,介绍了图形参数、文本与图例添加、图形组合以及多种基础图形的应用,并进一步讨论了数据可视化在数据科学中的重要作用。

如果用一句话概括本讲内容,可以表述为:

数据可视化的本质,不只是把数据画出来,而是借助视觉表达把数据中的分布、关系、趋势和结构清晰地呈现出来。