数据挖掘与R语言
2026年10月27日
重要
上节课我们用 base R 画了几种图,也立好了“坐标诚实、标注完整、颜色有意义”的规矩。今天换一套语法:把“先画图、再补装饰”换成“数据 + 映射 + 图层,用一个 + 叠起来”。
aes()、geom_*() 各负责什么aes() 是“数据与视觉属性的映射描述”+ 叠加图层:从空白画布开始,数据、映射、图层配齐,图才出来geom_bar() 或 geom_col()
reorder() 把类别按数值排序,交换 x 和 y 就能把竖柱变成横条geom_line() 先画单条折线(分类轴上用 group = 1 连线),再画多条折线,并说清多条折线里 color 与 group 各自管什么labs() 补齐标题与带单位的轴说明第 15 讲:看懂图,画对图
1. 要比较两组汽车的平均油耗谁高,按人眼读图精度排序,最可靠的是哪种视觉编码? A. 颜色深浅 B. 柱子的长度 C. 饼图扇形的角度 D. 气泡的面积
2. 柱状图的数值轴为什么通常要从 0 开始? A. 画起来省事 B. 柱子是长度编码,不从 0 起会夸大组间差距 C. R 的默认要求 D. 为了放得下标题
4. 拿到一个分析任务,选图要先看两件事:变量的 ______ 和变量的 ______。
提示
开场一问:base R 想加标题、加轴名、给柱子染色,要回头补 main=、xlab=、col= 等参数——图的零件散在参数里。今天的 ggplot2 走另一条路:每个零件写成一层,用 + 往上摞。
同样是统计不同车型的数量,Base R 和 ggplot2 的思路有什么不同?
一个包,一套语法
library():注记
安装与加载属于“准备工作”,不是画图语法——把它当成“打开工具箱”。
ggplot(data, mapping) + geom + scale + coord + facet + labels + theme
ggplot(
data = mpg, # 1. 数据
mapping = aes(x = class, fill = drv) # 2. 映射
) + # 用 + 往上叠图层
geom_bar() + # 3. geom_* 几何对象
# stat 和 position 可以在图层中设置
# geom_bar(stat = "count", position = "stack") +
scale_fill_brewer(palette = "Set2") + # 4. 标度
labs(
title = "各车型的车辆数量", # 5. 标签:图标题
x = "车型类别", # 横轴名
y = "车辆数(辆)", # 纵轴名(带单位)
fill = "驱动方式" # 图例标题
) + # 5. 标签
theme_minimal() # 6. 主题重要
data、aes() 和 geom_*(): 构成理解 ggplot2 的基本主线:数据决定使用哪些观测,映射决定数据如何对应视觉属性,几何对象决定用什么形状呈现数据。
stat 和 position: 分别涉及统计变换与位置调整;
scale、coord、facet 和 theme: 控制视觉映射、坐标系统、图形布局和整体外观。这些组件不必每次都显式写出,ggplot2 会根据具体图层和绘图设置使用相应的默认行为。
本讲先学 data、aes() 和 geom_*() 三件套;stat、position、标度、分面和主题等内容留待后续课程展开。
mapping =是什么ggplot() 的第二个参数叫 mapping(映射)。完整写法是:
mapping = 可以省略,R 按位置匹配,所以常见写法是 ggplot(mpg, aes(x = class))。初学时建议先保留完整写法,看清每个参数的角色。
aes()是什么aes 是 aesthetics(美学属性)的缩写,指图形上可以被看见的属性:横纵坐标位置、颜色、形状、大小、透明度等。
aes() 不是在设定一个具体的值,而是在声明:“数据表里的某一列,对应图形的某一个视觉属性。”
| 数据列 | 对应的视觉属性 | 写法 |
|---|---|---|
displ |
横轴位置 | x = displ |
hwy |
纵轴位置 | y = hwy |
drv |
颜色 |
fill = drv 或 color = drv
|
geom_*():几何对象图层ggplot() 管“用什么数据、怎么映射”,geom_*() 管“把数据画成什么形状”:柱子、条、折线……geom 后的星号 * 是占位符,具体写成图形名;本讲用“三兄弟”,先按要回答的问题选:| 你要…… | 用哪个 geom | 轴的写法 |
|---|---|---|
| 数个数 | geom_bar() |
只给一个轴 |
| 画现成数值 | geom_col() |
给两个轴 |
| 看先后顺序上的走势 | geom_line() |
给两个轴 |
提示
geom 图层就是画图的“笔”:同一个 ggplot(mpg, aes(x = class)),换 geom_col()、geom_line() 就换一种图——第四节、第五节逐个上手。
一张 ggplot2 图 = 数据 + 映射 + 图层
提示
映射只说明“用哪一列或几列”的数据,不说明“画什么图形”。 没有图层,就只剩一张空白的坐标轴。这就是为什么 geom_*() 是必不可少的一层。
提示
柱子的高低是 R 数出来的个数,y 轴标签叫 count,数据框里并没有这一列。
重要
labs() 补充标题、轴名与图例标题,也用 + 添加。它不是画图的必需条件,但正式分析里,标题清楚、轴名准确、单位完整,是图表规范的重要部分。
把 3.3 节的代码照抄一遍(模仿),然后把 x 换成 drv,drv 的含义是:4 为四驱,f 为前驱,r 为后驱。把标题与轴名改成对应的内容(练习)。
画完回答:三种驱动方式各有多少辆车?
表里已有现成的数值列,就用这十二家公司的虚构财务数据(教学虚构):
再补三列——成本、信用评级,以及利润 profit = revenue - cost:
geom_bar() 画评级分布提示
数出来:A 级 2 家、B 级 4 家、C 级 6 家。rating 这一列只有字母,没有计数——个数是 geom_bar() 现场数出来的。
geom_col() 画公司营收revenue 是现成的数值列,这时要给 两个轴:x 放公司,y 放营收。
重要
口诀:数个数用 geom_bar()(只给一个轴),画数值用 geom_col()(给两个轴)。 先问自己:这列数据是现成的数值,还是要让 R 去数?
横向柱状图只要交换 x 和 y,再用 reorder() 把公司按营收排序。
重要
reorder() 只改变类别的顺序,不改数据本身。横向图交换 x 和 y即可;旧写法 coord_flip() 官方已不推荐,我们统一用对调。
mpg 画“每种驱动方式各有几辆车”的柱状图(drv),用 geom_bar(),补标题与轴名;mpg 画“每种车型的平均高速油耗”的柱状图(class),先用 summarise() 算出平均值,再用 geom_col() 画;mpg 画“各厂牌平均城市油耗”的横向柱状图(cty 按 manufacturer 求均值),用 reorder() 排序。三张图都要标题与带单位的轴名(油耗单位是英里/加仑)。做完想一想:为什么①不需要 summarise(),②③一定需要?
折线要说清“谁跟谁连”
自查:12 行 = 3 家公司 × 4 个季度;加总 1300、980、1560,与 4.1 一致。
group = 1 连成一条quarter_wide %>% # 数据:季度明细表
group_by(quarter) %>% # 按季度分组
summarise(revenue = sum(revenue)) %>% # 每季度把三家加总
ggplot(aes(x = quarter, # 映射:横轴季度
y = revenue, # 纵轴合计营收
group = 1)) + # 单条折线:所有点连成一条
geom_line(linewidth = 1) + # 图层:折线,线宽 1
geom_point(size = 2) + # 图层:再叠上数据点
labs(title = "三家公司合计季度营收走势", # 标签:图标题
x = "季度", y = "营收(万元)") # 轴名(带单位)提示
先把三家公司的每个季度加总成 4 行小表,再画折线。横轴 quarter 是分类变量,ggplot2 不确定哪些点该连线,group = 1 就是告诉它:所有点连成一条线。读数:季度合计 840 → 920 → 955 → 1125,逐季走高。
要看清每家公司各自的走势,就不该加总——直接画多条折线。
提示
5.2 画一条线,用 group = 1 把点全连起来;这里每家公司一条线,分组就要按 company。color = company 区分公司、生成图例;group = company 指定哪些点连成同一条线——两者作用不同,即使这里都是 company。
用 ggplot2 内置的 economics 画失业人数的折线图:横轴 date,纵轴 unemploy(单位:千人),补标题与轴名。
画完说一句:哪段时间拐头向上、哪段回落?
选图 → 画图 → 加字 → 验收
任务 A(排名):用 mpg 画“各厂牌平均高速油耗”的横向柱状图,最高的在最上面,补齐标题、带单位的轴名与 caption(数据来源:ggplot2::mpg)。
任务 B(趋势):用 economics 画个人储蓄率(psavert,单位:%)的折线图:横轴 date,补齐标题、带单位的轴名与 caption(数据来源:ggplot2::economics)。配一句话:它适合回答什么问题?
data、aes()、geom_*() 三件套齐全,层与层之间用 + 连接,没忘写geom_bar(),画数值 geom_col(),看趋势 geom_line()
caption 写来源除第 3 题复用课堂自造的 company_data 外,其余只用 R 内置数据(mpg、economics),代码与结果都保留在可见代码块中:
mpg 共 234 行,按 class 分组计数加总应等于 234。geom_bar() 画一张“各厂牌车辆数”的图,用 geom_col() 画一张“各厂牌平均城市油耗”的图,两张都配 labs() 标题与带单位的轴名,数据来源写进 caption。第17讲:常见图表类型(二)——直方图、散点图和箱形图
geom_histogram():一个数值变量的分布形状geom_point(): 两个数值型变量的关系geom_boxplot():多组分布的中位数、离散程度与异常值提示
课前准备:留着你的 mpg 与 company_data。下节课要在数值变量上直接画分布图——今天学的 aes() 映射与 labs() 规范,那节课会变成配色与图例的基本功。
第16讲:ggplot2 图形语法入门——柱状图与折线图
"The charts you choose shape the conclusion you leave behind." 语法不是为好看,而是让同一份数据能被反复追问:数据、映射、图层各归其位,换一种图只需换一个 geom。准确传达信息永远优先于视觉效果。
朱 奇 | 锦城大学 · 财会学院