R 语言 ggplot2 绘图入门教程
一、什么是 ggplot2?
ggplot2 是 R 语言中非常流行的数据可视化工具包,属于 tidyverse 生态系统。它基于图形语法(Grammar of Graphics),允许用户通过组合不同的图形元素,创建美观且具有专业水准的统计图表。
ggplot2 常用于:
- 散点图(Scatter Plot)
- 折线图(Line Plot)
- 柱状图(Bar Chart)
- 直方图(Histogram)
- 箱线图(Boxplot)
- 分组图与多面板图(Faceted Plot)
本教程使用 R 自带的 mtcars 和 iris 数据集,不需要另外下载数据。
二、安装与加载 ggplot2
首次使用时,需要安装:
install.packages("ggplot2")
安装完成后,每次开启新的 R 会话,只需要运行:
library(ggplot2)
查看内置数据集:
head(mtcars)
str(mtcars)
summary(mtcars)
mtcars 包含 32 辆汽车的相关信息,例如:
变量 | 含义 |
mpg | 每加仑汽油行驶英里数 |
wt | 汽车重量(千磅) |
hp | 马力 |
cyl | 汽缸数量 |
am | 变速箱类型(0=自动,1=手动) |
三、ggplot2 的基本语法
ggplot2 的核心结构如下:
ggplot(data = 数据集,
aes(x = 横轴变量, y = 纵轴变量)) +
geom_图形类型() +
labs(title = "图表标题",
x = "横轴名称",
y = "纵轴名称") +
theme_minimal()
主要组成部分:
- ggplot():指定数据集。
- aes():指定变量与图形属性之间的映射关系。
- geom_*():选择图形类型。
- labs():设置标题与坐标轴名称。
- theme_*():控制图形外观。
特别注意:ggplot2 使用 + 将不同图形元素组合起来。
四、六种常见图形及代码实例
1. 散点图(Scatter Plot)
研究问题:汽车重量与燃油效率之间是否存在关系?
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point(color = "blue", size = 3) +
labs(
title = "汽车重量与燃油效率",
x = "重量(千磅)",
y = "每加仑英里数"
) +
theme_minimal()
解释: 横轴表示汽车重量,纵轴表示燃油效率。从散点分布可以观察到,重量越大的汽车,通常燃油效率越低。
还可以加入线性回归线:
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point(color = "blue") +
geom_smooth(method = "lm", se = TRUE) +
theme_minimal()
其中 method = "lm" 表示使用线性回归,se = TRUE 显示拟合均值的置信区间(默认 95%)。
2. 直方图(Histogram)
研究问题:汽车燃油效率的分布情况如何?
ggplot(mtcars, aes(x = mpg)) +
geom_histogram(
binwidth = 3,
fill = "skyblue",
color = "black"
) +
labs(
title = "燃油效率分布",
x = "MPG",
y = "汽车数量"
) +
theme_minimal()
解释: 直方图将连续变量划分为若干区间,柱子的高度代表落在该区间内的观测数量。binwidth = 3 表示每个区间宽度为 3 MPG。
3. 柱状图(Bar Chart)
研究问题:不同汽缸数量的汽车分别有多少辆?
ggplot(mtcars, aes(x = factor(cyl))) +
geom_bar(fill = "steelblue") +
labs(
title = "不同汽缸数量的汽车",
x = "汽缸数量",
y = "汽车数量"
) +
theme_minimal()
解释: factor(cyl) 将汽缸数量转换为类别变量。geom_bar() 自动计算每个类别的观测数量。
4. 箱线图(Boxplot)
研究问题:不同汽缸数量的汽车,其燃油效率是否存在差异?
ggplot(mtcars,
aes(x = factor(cyl),
y = mpg,
fill = factor(cyl))) +
geom_boxplot() +
labs(
title = "不同汽缸汽车的燃油效率",
x = "汽缸数量",
y = "MPG"
) +
theme_minimal() +
theme(legend.position = "none")
解释: 箱线图显示中位数、四分位数、须线及可能的异常值。它适合比较不同类别的数值分布。
从 mtcars 数据可以观察到,4 缸汽车的 MPG 通常高于 6 缸和 8 缸汽车。
5. 折线图(Line Plot)
使用另一个 R 内置数据集 economics(由 ggplot2 提供)。
研究问题:美国失业人数如何随时间变化?
ggplot(economics,
aes(x = date, y = unemploy)) +
geom_line(color = "red", linewidth = 1) +
labs(
title = "美国失业人数变化",
x = "日期",
y = "失业人数(千人)"
) +
theme_minimal()
解释: 折线图特别适合分析时间序列数据。geom_line() 将按照横轴顺序连接各个观测点。
6. 分面图(Faceted Plot)
研究问题:不同鸢尾花品种的花瓣长度与宽度之间的关系是否相同?
使用 R 内置的 iris 数据集:
ggplot(iris,
aes(x = Petal.Length,
y = Petal.Width)) +
geom_point(color = "darkgreen") +
facet_wrap(~ Species) +
labs(
title = "不同品种鸢尾花的花瓣特征",
x = "花瓣长度",
y = "花瓣宽度"
) +
theme_minimal()
解释: facet_wrap(~ Species) 根据品种将数据分成三个子图,方便比较不同组之间的关系。
五、进阶功能:颜色、大小与主题
ggplot2 可以利用 aes() 将其他变量映射到颜色、点的大小或形状。
例如:
ggplot(mtcars,
aes(x = wt,
y = mpg,
color = factor(cyl),
size = hp)) +
geom_point(alpha = 0.7) +
labs(
title = "汽车重量、马力与燃油效率",
x = "重量",
y = "MPG",
color = "汽缸数",
size = "马力"
) +
theme_classic()
这张图同时呈现四个变量:
- X 轴:汽车重量
- Y 轴:燃油效率
- 颜色:汽缸数量
- 点的大小:马力
特别需要区分以下两种写法:
# 所有点都使用蓝色
geom_point(color = "blue")
# 根据汽缸数量自动分配颜色
geom_point(aes(color = factor(cyl)))
前者设置固定颜色,后者将颜色映射到数据变量。
六、常见函数总结
函数 | 主要用途 |
ggplot() | 建立绘图对象 |
aes() | 定义变量映射 |
geom_point() | 散点图 |
geom_line() | 折线图 |
geom_bar() | 柱状图 |
geom_histogram() | 直方图 |
geom_boxplot() | 箱线图 |
geom_smooth() | 趋势线或回归拟合 |
facet_wrap() | 按类别创建多个子图 |
labs() | 设置标题和标签 |
theme_minimal() | 使用简洁主题 |
ggsave() | 保存图形文件 |
例如,保存最近生成的图表:
ggsave(
filename = "my_plot.png",
width = 8,
height = 5,
dpi = 300
)
七、练习题
练习一:散点图
使用 mtcars 数据,研究汽车马力(hp)与燃油效率(mpg)之间的关系。绘制散点图,加入线性回归线,并解释变量之间的关系。
查看代码提示
练习二:箱线图
比较自动变速箱与手动变速箱汽车的燃油效率是否存在明显差异,并通过箱线图说明。
查看代码提示
练习三:分组分析
使用 iris 数据集,绘制 Sepal.Length 与 Sepal.Width 的散点图,根据 Species 使用不同颜色,并解释三个品种的分布差异。
查看代码提示
八、总结
学习 ggplot2 最重要的是掌握三个基本概念:
- 数据(Data):使用哪个数据集?
- 映射(Aesthetics):哪些变量对应 X 轴、Y 轴、颜色或大小?
- 几何对象(Geometry):使用哪一种图形呈现数据?
掌握这三个概念后,便可以通过增加 labs()、facet_wrap()、theme_*() 等函数,逐步创建更加复杂的统计图形。
对于初学者,建议先熟悉散点图、直方图、柱状图与箱线图,再学习分组绘图、多面板图以及统计模型的可视化。