
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的图层化绘图再到分组着色、回归拟合、气泡图、分面布局和密度图等进阶技巧。散点图虽然简单但通过合理的参数定制和图层组合可以承载非常丰富的信息。建议读者在实际项目中多尝试不同的映射方式和主题风格找到最适合自己数据的可视化方案。