本讲无课件,笔记基于课堂录音(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 文件夹为空,无课件文件;内容全部来自课堂录音
二、学习目标
- 理解 ggplot2 的「图层语法(grammar of graphics)」:坐标系层、geom 数据层、scale 标度层三层结构,以及用加号
+逐层叠加的方式。
- 能根据数据类型(离散 / 连续)与分析目的(看分布、看关联、看时间趋势)选择合适的图形类型:条形图、直方图、箱线图、散点图、折线图。
- 能读懂并书写
ggplot()、geom_*()、scale_*_*()三类函数,完成绘图并美化坐标轴标题、刻度与图例标签。
- 掌握图形导出的规范方法(
ggsave()函数或右键另存为),理解为何不能用屏幕截图。
- 区分 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):可在区间内连续取值的数值数据。
第二问:分析目的是什么?(课堂归纳的四种基本图形)
- 离散数据看分布 → 条形图(bar plot),各类别各占多少;
- 单个连续变量看分布 → 直方图(histogram)或箱线图(box plot),后者还能直接读出中位数与离群值(outlier)——课堂演示人均 GDP 箱线图时可见大部分数据集中、拖有大量离群值;
- 两个连续变量看关联 → 散点图(scatter plot),可为进一步回归分析做铺垫;
- 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 的三层结构:
五、课前思考/自测
依据录音内容自拟:
- 同样是「按大洲着色」,
color = continent与fill = continent在直方图上分别会得到什么效果?为什么会不同?
- 折线图与散点图的唯一区别是什么?什么情况下应该选折线图?
- 写出把 y 轴刻度改为 25/50/75、并把图例标题改为「Continent」的完整代码。
- 只执行
p <- ggplot(gm, aes(x = gdpPercap))而不单独执行p,为什么看不到任何图形?
- 为什么图形导出应该用
ggsave()而不是屏幕截图?(从分辨率与可复现性两方面回答)
六、参考材料
- 课堂录音总结:
Recordings/MSBS7102-1009-summary.md
- 课堂录音转写:
Recordings/MSBS7102-1009-transcript.md
- 延伸阅读(ggplot2 官方文档):https://ggplot2.tidyverse.org/reference/index.html
七、课堂要点补充(来源:课堂录音)
- ggplot2 与 dplyr 的连接符区别是本讲反复强调的要点:dplyr 用管道
|>传递数据框,ggplot2 用加号+叠加图层。
- color 与 fill 的坑:课堂现场演示了直方图按
color = continent只上边框色的现象,提醒遇到结果与预期不符时查?函数名帮助文档。
- 覆盖规则与换行建议:
geom_*()中的映射可覆盖ggplot()的初始映射;实际写代码建议在每个+后换行。
- 刻度参数易错点:
breaks必须用c()向量给出且注意带 s;labels顺序必须与 breaks 或类别顺序一一对应。
- 颜色设计常识:颜色几乎总是用于区分离散类别而非表达连续数值,因为人眼难以精确对应颜色深浅与数值。
- 警告与错误:只要不是红色 error,通常无需担心;error 时先检查包是否已加载(Packages 面板勾选状态)。
- 课程节奏:本讲无课件,全程 RStudio 现场演示;老师强调读懂代码、理解行为、知道如何查文档比死记函数更重要。
Loading...
