MSBS7102 Lecture 6 · ggplot2 数据可视化

本讲无课件,基于课堂录音整理:ggplot2 三层绘图语法(坐标系、geom 数据层、scale 标度层)、按数据类型选择图形、坐标轴与图例美化、ggsave 规范导出。
本讲无课件,笔记基于课堂录音(Recordings/MSBS7102-1009-summary.md 与 Recordings/MSBS7102-1009-transcript.md)整理。课堂沿用上一讲的同一套幻灯片,ggplot2 部分约自第 27 页起,并在 RStudio 中以示例数据集现场演示。

一、本讲信息

  • 课程:MSBS7102 Foundations in Biomedical Data Science(HKU MMedSc)
  • 讲次:Lecture 6
  • 日期:2026-10-09
  • 主题:ggplot2 数据可视化(data visualization)——绘图语法、图形类型选择、坐标轴与图例美化、图形导出
  • 材料:本讲 Materials 文件夹为空,无课件文件;内容全部来自课堂录音

二、学习目标

  1. 理解 ggplot2 的「图层语法(grammar of graphics)」:坐标系层、geom 数据层、scale 标度层三层结构,以及用加号 + 逐层叠加的方式。
  1. 能根据数据类型(离散 / 连续)与分析目的(看分布、看关联、看时间趋势)选择合适的图形类型:条形图、直方图、箱线图、散点图、折线图。
  1. 能读懂并书写 ggplot()、geom_*()、scale_*_*() 三类函数,完成绘图并美化坐标轴标题、刻度与图例标签。
  1. 掌握图形导出的规范方法(ggsave() 函数或右键另存为),理解为何不能用屏幕截图。
  1. 区分 R 中的警告(warning)与错误(error)信息,并知道用 ?函数名 查官方文档排错。

三、核心内容

3.1 ggplot2 与 tidyverse 的关系

ggplot2 是 R 语言中专注于数据可视化的包(package),是 tidyverse 生态的一部分。加载方式有两种:library(tidyverse)(整 family 一起加载)或 library(ggplot2)(单独加载)。老师推荐前者:做可视化时几乎必然同时需要 dplyr 等包做数据处理,一次加载更方便。
加载与运行时注意区分两类信息:
  • warning(警告):只要不是红色的 error,程序仍在正常工作,通常无需担心;
  • error(错误):说明代码有错,需要检查(可在 Packages 面板确认 tidyverse 是否已勾选加载)。
ggplot2 与 dplyr 的根本区别在连接符:
包
连接符
原因
dplyr
管道操作符 `
>`(竖线 + 大于号)
ggplot2
加号 +
各图层是在图上叠加元素,不需要传递数据框
老师强调:不要求死记所有函数细节。编程语言会持续演进、新特性层出不穷,只要能读懂代码、理解其行为、知道如何查文档求助即可。

3.2 示例数据集:gapminder

课堂演示使用 gapminder 数据集,由 GapMinder 基金会收集的全球健康调查数据,共 6 个变量:
变量
含义
country
国家
continent
所属大洲
year
收集年份(每 5 年一次)
pop
当时该国人口规模
gdpPercap
人均 GDP(美元计)
lifeExp
预期寿命(life expectancy)

3.3 选图思路:数据类型 × 分析目的

第一问:数据是什么类型?
  • 离散型(discrete):二分类或有限个类别的分类数据;
  • 连续型(continuous):可在区间内连续取值的数值数据。
第二问:分析目的是什么?(课堂归纳的四种基本图形)
  1. 离散数据看分布 → 条形图(bar plot),各类别各占多少;
  1. 单个连续变量看分布 → 直方图(histogram)或箱线图(box plot),后者还能直接读出中位数与离群值(outlier)——课堂演示人均 GDP 箱线图时可见大部分数据集中、拖有大量离群值;
  1. 两个连续变量看关联 → 散点图(scatter plot),可为进一步回归分析做铺垫;
  1. X 轴是时间 → 折线图(line chart)而非散点图。这是折线图与散点图唯一的区别:时间是连续的,应把点连成线以体现连续性。

3.4 ggplot2 三层语法(实际五层,课程简化为三层)

第一层:坐标系。 用 ggplot() 定义数据与 x/y 映射,作为后续一切图层的基础底图:
  • mapping = aes() 是美学映射(aesthetic mapping)函数,把数据列映射到图形属性(x、y、color 等);
  • 位置参数简写 ggplot(gm, aes(x = gdpPercap)) 与上面完全等价(此时仅定义了 x 轴,图形其余部分为空白)。
第二层:数据几何层。 所有函数以 geom_(geometry,几何)为前缀,常用如:
函数
绘制的图形
geom_point()
散点图
geom_histogram()
直方图
geom_boxplot()
箱线图
geom_bar()
条形图
geom_line()
折线图
geom_smooth()
在散点上叠加平滑曲线
在 geom_*() 的 aes() 里可补充指定 y、color、fill、shape 等。两个易混关键字:
  • color:只给边框 / 轮廓上色;
  • fill:填充图形内部的颜色。
课堂现场踩过的坑:直方图按大洲用 color = continent 着色,结果只有边框有色、矩形内部仍是空的;把 color 改成 fill 才真正填充。遇到此类「结果与预期不符」的情况,应查 ?函数名 帮助文档确认参数含义。
两条补充规则与建议:
  • 覆盖规则:第一层 ggplot() 里指定的映射,可在第二层 geom_*() 里重新指定并覆盖,后写的优先(如把 x 从人均 GDP 改成预期寿命)。这属于实践细节,不影响主干理解;
  • 换行建议:幻灯片因版面把代码压成一行,实际书写时建议在每个 + 后换行,否则图层越加越长,难以阅读和调试。
第三层:标度层(scale,负责坐标轴与图例)。 函数名固定三段式:scale_ + 美学项 + 数据类型,例如:
  • scale_x_continuous():操作 x 轴,x 是连续变量;
  • scale_y_discrete():操作 y 轴,y 是离散变量;
  • scale_color_discrete():操作颜色图例,颜色映射到离散类别。
三个最常用参数:
  • name:轴标题 / 图例标题(如把原始变量名 gdpPercap 改成对读者有信息量的 "GDP per capita");
  • breaks:刻度出现的取值位置,必须用 c() 向量给出(注意带 s:breaks 而非 break,后者是另一个关键字,写错会出问题)。课堂演示把 y 轴刻度从默认的 40/60/80 改为 c(25, 50, 75);
  • labels:刻度 / 图例上显示的文字,顺序必须与 breaks(或类别顺序)一一对应,打乱会错位。
关于颜色还有一个设计常识:颜色映射到离散变量时,每个类别一种颜色并配图例;映射到连续变量时会变成光谱式渐变。由于人眼很难把具体数值精确对应到颜色深浅,实践中颜色几乎总是用来区分类别,而非表达连续数值。
整合课堂最终演示(在散点图上完成三处美化):
(图例缩写按 Africa、Americas、Asia、Europe、Oceania 的原顺序一一对应。)
其他课堂演示片段:

3.5 图形保存与导出

推荐方式:ggsave()
  • 支持的常见格式:png、jpeg、pdf 等(以扩展名自动识别);
  • 需要指定保存的是哪个图形对象(本例为 p)。
为什么不能用屏幕截图:截图分辨率低、未按矢量比例保存;而 ggsave 导出的文件是规范的可复现产物(reproducible),可直接用于报告与作业提交。
备选方式:RStudio Plots 面板的 Export 菜单(本质是同一功能的图形界面版);课堂提及但不作为首选。

四、关键图解

本讲无课件,无原始插图;以下用文字图说明 ggplot2 的三层结构:

五、课前思考/自测

依据录音内容自拟:
  1. 同样是「按大洲着色」,color = continent 与 fill = continent 在直方图上分别会得到什么效果?为什么会不同?
  1. 折线图与散点图的唯一区别是什么?什么情况下应该选折线图?
  1. 写出把 y 轴刻度改为 25/50/75、并把图例标题改为「Continent」的完整代码。
  1. 只执行 p <- ggplot(gm, aes(x = gdpPercap)) 而不单独执行 p,为什么看不到任何图形?
  1. 为什么图形导出应该用 ggsave() 而不是屏幕截图?(从分辨率与可复现性两方面回答)

六、参考材料

  • 课堂录音总结:Recordings/MSBS7102-1009-summary.md
  • 课堂录音转写:Recordings/MSBS7102-1009-transcript.md

七、课堂要点补充(来源:课堂录音)

  1. ggplot2 与 dplyr 的连接符区别是本讲反复强调的要点:dplyr 用管道 |> 传递数据框,ggplot2 用加号 + 叠加图层。
  1. color 与 fill 的坑:课堂现场演示了直方图按 color = continent 只上边框色的现象,提醒遇到结果与预期不符时查 ?函数名 帮助文档。
  1. 覆盖规则与换行建议:geom_*() 中的映射可覆盖 ggplot() 的初始映射;实际写代码建议在每个 + 后换行。
  1. 刻度参数易错点:breaks 必须用 c() 向量给出且注意带 s;labels 顺序必须与 breaks 或类别顺序一一对应。
  1. 颜色设计常识:颜色几乎总是用于区分离散类别而非表达连续数值,因为人眼难以精确对应颜色深浅与数值。
  1. 警告与错误:只要不是红色 error,通常无需担心;error 时先检查包是否已加载(Packages 面板勾选状态)。
  1. 课程节奏:本讲无课件,全程 RStudio 现场演示;老师强调读懂代码、理解行为、知道如何查文档比死记函数更重要。
上一篇
MSPH7901 Session 4 · 统计推断
下一篇
MSBS7101 Lecture 6 · 变异检测与注释(一):LoFreq 与 GATK
Loading...