☰
R 绘图 - 散点图:从基础到进阶实战
2026/10/22 2:25:30 网站建设 项目流程

1. 引言

散点图是数据可视化中最基础也最常用的图形之一,它通过二维平面上的点来展示两个变量之间的关系。在 R 语言中,绘制散点图的方式非常灵活,既可以使用基础绘图系统,也可以借助 ggplot2 等高级绘图包实现更丰富的定制。本文将从基础绘图开始,逐步介绍散点图的常见变体、分组着色、回归拟合线以及多面板布局等进阶技巧,并给出大量可直接运行的代码示例。

2. 环境准备与数据加载

在开始绘图之前,我们需要先准备 R 环境并加载必要的包。本文主要使用基础绘图函数plot()和ggplot2包。如果你还没有安装ggplot2,请先运行下面的安装命令。

# 安装 ggplot2(如果尚未安装) install.packages("ggplot2") 加载 ggplot2 library(ggplot2) 查看内置数据集 mtcars 的结构 str(mtcars) head(mtcars)

本文将以 R 内置数据集mtcars和iris为例进行演示。这两个数据集分别包含汽车性能数据和鸢尾花测量数据,非常适合用来展示散点图的各种用法。

3. 基础散点图:使用 plot() 函数

R 基础绘图系统中的plot()函数是最直接的散点图绘制方式。下面我们以mtcars数据集中汽车的重量(wt)和每加仑行驶里程(mpg)为例,绘制一张基础散点图。

# 基础散点图:重量 vs 油耗 plot(mtcars$wt, mtcars$mpg, main = "汽车重量与油耗的关系", xlab = "重量 (1000 lbs)", ylab = "每加仑行驶里程 (mpg)", pch = 19, # 实心圆点 col = "steelblue", cex = 1.2) # 点的大小

运行上述代码后,你会得到一张以重量为横轴、油耗为纵轴的散点图。从图中可以直观地看出,随着汽车重量的增加,每加仑行驶里程大致呈下降趋势,说明两者之间存在负相关关系。

3.1 自定义点的形状和颜色

R 提供了多种点形状(pch参数)和颜色(col参数)供选择。下面演示几种常见的组合。

# 不同点形状示例 par(mfrow = c(2, 2)) # 2x2 布局 空心圆 plot(mtcars$wt, mtcars$mpg, pch = 1, col = "black", main = "pch = 1 (空心圆)") 三角形 plot(mtcars$wt, mtcars$mpg, pch = 17, col = "darkgreen", main = "pch = 17 (实心三角形)") 菱形 plot(mtcars$wt, mtcars$mpg, pch = 18, col = "purple", main = "pch = 18 (菱形)") 自定义颜色渐变 plot(mtcars$wt, mtcars$mpg, pch = 19, col = rgb(0.2, 0.4, 0.8, alpha = 0.6), main = "半透明蓝色点")

4. 使用 ggplot2 绘制散点图

ggplot2是 R 中最流行的数据可视化包,它采用图层叠加的理念,让绘图过程更加灵活和优雅。下面我们用ggplot2重新绘制上面的散点图。

# ggplot2 基础散点图 ggplot(data = mtcars, aes(x = wt, y = mpg)) + geom_point(size = 3, color = "steelblue") + labs(title = "汽车重量与油耗的关系", x = "重量 (1000 lbs)", y = "每加仑行驶里程 (mpg)") + theme_minimal()

这段代码的核心逻辑是:先用aes()指定横纵轴变量,再用geom_point()添加散点图层,最后通过labs()和theme_minimal()设置标题和主题风格。

4.1 按类别分组着色

当数据中存在分类变量时,我们可以通过颜色或形状来区分不同组别。下面以iris数据集为例,按鸢尾花种类对散点进行着色。

# 按种类分组着色 ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + geom_point(size = 3, alpha = 0.8) + labs(title = "鸢尾花萼片长度与宽度", x = "萼片长度 (cm)", y = "萼片宽度 (cm)") + theme_minimal() + scale_color_manual(values = c("setosa" = "#E41A1C", "versicolor" = "#377EB8", "virginica" = "#4DAF4A"))

通过color = Species映射,三种鸢尾花会被自动赋予不同颜色,并在右侧生成图例。你也可以用shape参数按类别区分点的形状。

4.2 添加回归拟合线

在散点图中添加回归线可以帮助我们更清晰地观察变量之间的趋势。使用geom_smooth()可以轻松实现。

# 添加线性回归线 ggplot(data = mtcars, aes(x = wt, y = mpg)) + geom_point(size = 3, color = "steelblue") + geom_smooth(method = "lm", se = TRUE, color = "darkred") + labs(title = "汽车重量与油耗的线性回归", x = "重量 (1000 lbs)", y = "每加仑行驶里程 (mpg)") + theme_minimal()

其中method = "lm"表示使用线性回归模型,se = TRUE会在回归线周围绘制置信区间阴影。如果你希望按分组分别拟合回归线,只需在aes()中加入color = 分组变量即可。

5. 散点图的进阶技巧

掌握了基础用法之后,我们再来看看一些更实用的进阶技巧,包括点的大小映射、分面布局以及密度散点图等。

5.1 用点的大小映射第三个变量

散点图不仅可以展示两个变量,还可以通过点的大小来映射第三个数值变量,形成气泡图效果。

# 气泡图:用点大小表示排量 ggplot(data = mtcars, aes(x = wt, y = mpg, size = disp)) + geom_point(alpha = 0.7, color = "darkorange") + scale_size_continuous(name = "排量 (cu.in.)") + labs(title = "汽车重量、油耗与排量的关系", x = "重量 (1000 lbs)", y = "每加仑行驶里程 (mpg)") + theme_minimal()

在这个例子中,size = disp将发动机排量映射为点的大小,点越大表示排量越大,从而在一张图中同时展示三个维度的信息。

5.2 分面散点图

当数据包含多个类别时,使用facet_wrap()或facet_grid()可以将散点图按类别拆分成多个小面板,便于对比分析。

# 按气缸数分面 ggplot(data = mtcars, aes(x = wt, y = mpg)) + geom_point(size = 3, color = "steelblue") + facet_wrap(~ cyl, ncol = 3) + labs(title = "不同气缸数下的重量与油耗关系", x = "重量 (1000 lbs)", y = "每加仑行驶里程 (mpg)") + theme_minimal()

运行后你会看到三个并排的小图,分别对应 4 缸、6 缸和 8 缸的汽车数据,这样就能更清晰地比较不同组别之间的趋势差异。

5.3 密度散点图

当数据点非常多且重叠严重时,普通散点图难以看清分布密度。此时可以使用geom_bin2d()或geom_hex()绘制密度散点图。

# 使用六边形分箱展示密度 ggplot(data = mtcars, aes(x = wt, y = mpg)) + geom_hex(bins = 15) + scale_fill_gradient(low = "lightblue", high = "darkblue") + labs(title = "重量与油耗的密度分布", x = "重量 (1000 lbs)", y = "每加仑行驶里程 (mpg)") + theme_minimal()

六边形分箱图将平面划分为多个六边形区域,并用颜色深浅表示每个区域内的数据点数量,非常适合处理大规模数据集的散点可视化。

6. 多面板布局与组合图

在实际报告中,我们经常需要将多张散点图组合在一起展示。R 基础绘图系统可以使用par(mfrow)实现,而ggplot2则推荐使用patchwork包进行组合。

# 安装并加载 patchwork install.packages("patchwork") library(patchwork) 创建两张散点图 p1 <- ggplot(mtcars, aes(wt, mpg)) + geom_point(color = "steelblue") + theme_minimal() p2 <- ggplot(mtcars, aes(hp, mpg)) + geom_point(color = "darkred") + theme_minimal() 并排组合 p1 + p2 + plot_annotation(title = "汽车数据散点图组合")

patchwork包使用+运算符即可将多个 ggplot 对象组合在一起,还支持/进行上下排列,非常直观。

7. 常见问题与调优建议

在绘制散点图时,有几个常见问题值得注意。首先是点的大小和透明度设置,当数据点较多时,适当降低透明度(alpha)可以避免重叠遮挡。其次是坐标轴范围,如果数据存在离群点,可以使用xlim()和ylim()调整显示范围。最后是图例位置,可以通过theme(legend.position = "top")等参数灵活控制。

# 调整坐标轴范围和图例位置 ggplot(data = mtcars, aes(x = wt, y = mpg, color = cyl)) + geom_point(size = 3) + xlim(1.5, 5.5) + ylim(10, 35) + theme_minimal() + theme(legend.position = "top")

8. 总结

本文系统介绍了 R 语言中绘制散点图的多种方法,从基础绘图系统的plot()函数,到ggplot2的图层化绘图,再到分组着色、回归拟合、气泡图、分面布局和密度图等进阶技巧。散点图虽然简单,但通过合理的参数定制和图层组合,可以承载非常丰富的信息。建议读者在实际项目中多尝试不同的映射方式和主题风格,找到最适合自己数据的可视化方案。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询