☰
R 绘图 - 散点图:从基础到进阶的完整实战指南
2026/10/21 2:24:07 网站建设 项目流程

1. 引言

散点图是数据可视化中最基础也最常用的图表类型之一,它通过点的位置展示两个连续变量之间的关系。在 R 语言中,绘制散点图的方式非常灵活,既可以使用基础绘图系统快速出图,也可以借助 ggplot2 等高级绘图包实现更美观、更复杂的可视化效果。本文将从基础语法讲起,逐步深入到分组着色、回归拟合、密度叠加等进阶技巧,并给出大量可直接运行的代码实例。

2. 基础散点图:plot() 函数

R 的基础绘图系统提供了plot()函数,这是绘制散点图最直接的方式。下面通过内置数据集mtcars演示如何绘制车重与油耗之间的关系。

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

运行上述代码后,会生成一张基础散点图。其中pch参数控制点的形状,col控制颜色,cex控制点的大小。如果希望使用公式接口,可以写成plot(mpg ~ wt, data = mtcars),效果相同。

3. 使用 ggplot2 绘制散点图

ggplot2 是 R 生态中最流行的可视化包,其图层语法让散点图的绘制更加直观和灵活。首先需要安装并加载包:

# 安装并加载 ggplot2 install.packages("ggplot2") library(ggplot2) 基础散点图 ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point(color = "steelblue", size = 3) + labs(title = "车重与油耗的关系", x = "车重 (1000 lbs)", y = "油耗 (mpg)") + theme_minimal()

在 ggplot2 中,aes()用于声明数据到图形属性的映射,geom_point()负责绘制散点图层。通过叠加不同的几何对象,可以轻松扩展图表功能。

4. 按分组着色与形状区分

当数据中包含分类变量时,可以通过颜色或形状区分不同组别,从而在一张图中展示更多信息。以下示例使用iris数据集,按鸢尾花品种着色:

# 按品种分组着色 ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + geom_point(size = 3, alpha = 0.8) + scale_color_manual(values = c("setosa" = "#E69F00", "versicolor" = "#56B4E9", "virginica" = "#009E73")) + labs(title = "鸢尾花萼片长度与宽度的关系", x = "萼片长度 (cm)", y = "萼片宽度 (cm)") + theme_minimal()

如果希望同时用形状区分组别,只需在aes()中增加shape = Species映射即可。对于基础绘图系统,可以使用pch和col参数配合legend()实现类似效果。

5. 添加回归拟合线

在散点图中添加回归线,可以直观展示变量之间的趋势关系。ggplot2 提供了geom_smooth()函数,支持线性、多项式等多种拟合方式。

# 添加线性回归线及置信区间 ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point(color = "darkgray", size = 3) + geom_smooth(method = "lm", se = TRUE, color = "red", fill = "pink") + labs(title = "车重与油耗的线性拟合", x = "车重 (1000 lbs)", y = "油耗 (mpg)") + theme_minimal()

参数se = TRUE表示显示置信区间阴影。如果希望按分组分别拟合,只需在aes()中保留color = 分组变量映射,geom_smooth()会自动为每个组绘制独立的拟合线。

6. 散点图矩阵与多面板

当需要同时考察多个变量之间的关系时,散点图矩阵是非常高效的工具。基础绘图系统提供了pairs()函数,而 ggplot2 生态中可以使用GGally包的ggpairs()函数。

# 基础绘图系统的散点图矩阵 pairs(iris[, 1:4], pch = 19, col = as.numeric(iris$Species), main = "鸢尾花数据的散点图矩阵") 使用 GGally 包绘制更美观的矩阵 install.packages("GGally") library(GGally) ggpairs(iris, aes(color = Species, alpha = 0.6))

散点图矩阵的对角线位置默认显示密度曲线或直方图,可以快速了解每个变量的分布情况,非常适合数据探索阶段使用。

7. 大数据集的散点图优化

当数据量达到数万甚至数十万条时,普通散点图会出现严重的重叠问题,导致无法看清数据分布。此时可以采用以下三种优化策略:

# 生成模拟大数据集 set.seed(123) n <- 50000 df <- data.frame(x = rnorm(n), y = rnorm(n)) 策略一:降低透明度 ggplot(df, aes(x = x, y = y)) + geom_point(alpha = 0.05, color = "steelblue") + theme_minimal() 策略二:使用六边形分箱图 library(hexbin) ggplot(df, aes(x = x, y = y)) + geom_hex(bins = 50) + scale_fill_viridis_c() + theme_minimal() 策略三:二维核密度估计 ggplot(df, aes(x = x, y = y)) + stat_density_2d(aes(fill = after_stat(density)), geom = "raster", contour = FALSE) + scale_fill_viridis_c() + theme_minimal()

透明度叠加适合中等规模数据;六边形分箱图将平面划分为六边形网格并统计频数,适合大规模数据;二维核密度图则通过颜色渐变展示密度分布,视觉效果最佳。

8. 添加标签与自定义主题

在散点图中标注关键数据点,可以增强图表的可读性。ggplot2 中可以使用geom_text()或geom_label()添加文本标签。

# 标注油耗最低的车型 library(dplyr) top_car <- mtcars %>% arrange(mpg) %>% slice(1:3) ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point(color = "steelblue", size = 3) + geom_label(data = top_car, aes(label = rownames(top_car)), nudge_y = 1.5, size = 3) + labs(title = "标注油耗最低的车型", x = "车重 (1000 lbs)", y = "油耗 (mpg)") + theme_bw() + theme(plot.title = element_text(hjust = 0.5, face = "bold"))

通过theme()函数可以精细控制标题居中、字体样式、网格线等细节,让图表更符合出版或演示需求。

9. 常见问题与注意事项

在实际绘图过程中,有几个常见问题需要特别留意:

  • 数据缺失:绘图前应使用na.omit()或complete.cases()处理缺失值,否则可能出现空白点或报错。
  • 坐标轴范围:使用xlim()和ylim()或coord_cartesian()控制坐标轴范围,避免异常值拉伸图形。
  • 中文显示:R 默认字体可能无法显示中文,需要设置family = "STHeiti"或使用showtext包加载中文字体。
  • 图片导出:使用ggsave()导出图片时,建议设置合适的dpi和width、height参数,保证出版质量。
# 导出高清图片示例 ggsave("scatter_plot.png", width = 8, height = 6, dpi = 300)

10. 总结

本文系统介绍了 R 语言绘制散点图的核心方法,从基础绘图系统的plot()函数,到 ggplot2 的分组着色、回归拟合、散点图矩阵、大数据优化和标签标注等进阶技巧。掌握这些内容后,读者可以根据数据特点和分析目标灵活选择合适的绘图方案。建议在实际项目中多尝试不同的参数组合,逐步形成自己的可视化风格。

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

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

立即咨询