R 绘图 – 散点图(手把手讲解)

R 绘图 – 散点图:从零开始掌握数据可视化核心技能

在数据分析的世界里,有一类图形被誉为“最直观的观察窗口”——它就是散点图。当你面对成千上万条数据时,如何快速发现变量之间的关系?R 语言中的散点图正是解决这一问题的利器。今天,我们就来深入探索 R 绘图 – 散点图,手把手带你从基础绘图到高级定制,掌握这项核心技能。

想象一下,你正在分析某电商平台的用户行为数据,想看看“用户浏览时长”和“购买金额”之间是否存在正相关关系。这时,一张清晰的散点图就能告诉你:数据点是否呈上升趋势?是否存在异常值?有没有明显的聚集区域?这些信息,用表格很难说清楚,但一张散点图就能一目了然。

什么是散点图?它的核心价值是什么?

散点图(Scatter Plot)是用于展示两个连续变量之间关系的二维图形。每一个数据点都代表一对数值(x, y),在坐标系中以点的形式标记出来。它的核心价值在于:揭示变量之间的相关性、趋势、异常值和分布模式

你可以把散点图想象成一个“数据雷达图”——在茫茫数据海中,它帮你快速捕捉到那些隐藏的规律。比如,如果点从左下向右上密集分布,那说明两个变量很可能正相关;如果点呈水平或垂直分布,则说明两者关系较弱。

在 R 中,plot() 函数是绘制散点图的基础工具。它简单、灵活,是学习 R 绘图的第一步。

基础散点图:用 plot() 函数快速上手

让我们从最简单的例子开始。假设我们有两组数据:学生的数学成绩(score)和英语成绩(english),我们想看看这两者之间是否有相关性。

math_scores <- c(85, 90, 78, 92, 88, 76, 94, 83, 87, 91)
english_scores <- c(82, 88, 75, 89, 85, 73, 90, 80, 84, 88)

plot(math_scores, english_scores,
     xlab = "数学成绩",
     ylab = "英语成绩",
     main = "数学与英语成绩散点图",
     pch = 16,      # 设置点的形状为实心圆
     col = "blue"   # 设置点的颜色为蓝色
)

这段代码中:

  • math_scoresenglish_scores 是两组数值向量,分别代表 x 轴和 y 轴的数据。
  • xlabylab 用于设置坐标轴标签,让图形更清晰。
  • main 设置图表标题。
  • pch = 16 表示使用实心圆作为点的形状(pch 是 plot character 的缩写)。
  • col = "blue" 设置点的颜色为蓝色。

运行后你会看到一个清晰的二维图,点的分布大致呈上升趋势,说明数学和英语成绩之间可能存在正相关关系。

自定义散点图:调整样式与增强可读性

基础图形已经能用,但真正让图表“出彩”的,是自定义。比如,你可以改变点的大小、颜色、形状,甚至添加趋势线。

调整点的大小与颜色

在实际场景中,我们常需要根据第三个变量来调整点的大小或颜色。比如,用点的大小表示“学生学习时长”,用颜色表示“班级”。

study_hours <- c(3.5, 4.0, 2.8, 4.5, 4.2, 2.5, 5.0, 3.8, 4.1, 4.6)

plot(math_scores, english_scores,
     xlab = "数学成绩",
     ylab = "英语成绩",
     main = "成绩与学习时长散点图",
     pch = 16,
     col = "darkgreen",
     cex = study_hours / 2  # cex 控制点的大小,除以 2 使图形更协调
)

这里,cex 是点的缩放因子。通过将 study_hours 除以 2,我们让学习时间越长的点越大,视觉上更直观。

添加趋势线:揭示变量间的关系

仅仅看点的分布还不够,我们希望量化这种关系。这时可以使用 abline() 函数添加一条趋势线。

model <- lm(english_scores ~ math_scores)

abline(model, col = "red", lwd = 2)
  • lm() 是线性模型函数,english_scores ~ math_scores 表示以数学成绩预测英语成绩。
  • abline() 在图中添加一条直线,model 提供斜率和截距。
  • col = "red" 设置线为红色,lwd = 2 设置线宽为 2,使其更醒目。

现在,你不仅能看到点的分布,还能看到一条“最佳拟合线”,帮助你判断关系的强弱。

使用数据框绘制散点图:更专业的数据组织方式

在真实项目中,我们通常使用 data.frame 来组织数据。这不仅能提高可读性,还便于后续分析。

student_data <- data.frame(
  name = paste("学生", 1:10),
  math = c(85, 90, 78, 92, 88, 76, 94, 83, 87, 91),
  english = c(82, 88, 75, 89, 85, 73, 90, 80, 84, 88),
  hours = c(3.5, 4.0, 2.8, 4.5, 4.2, 2.5, 5.0, 3.8, 4.1, 4.6)
)

plot(student_data$math, student_data$english,
     xlab = "数学成绩",
     ylab = "英语成绩",
     main = "学生数据散点图",
     pch = 16,
     col = "purple",
     cex = student_data$hours / 2
)

这样,数据更结构化,后续还能轻松使用 ggplot2 等高级包进行扩展。

高级技巧:结合 ggplot2 实现更美观的散点图

虽然 plot() 函数简单易用,但 ggplot2 是目前 R 中最流行、最强大的绘图包。它采用“图形语法”(Grammar of Graphics)思想,让绘图逻辑更清晰。

library(ggplot2)

ggplot(student_data, aes(x = math, y = english)) +
  geom_point(aes(size = hours, color = hours), pch = 16) +
  scale_color_gradient(low = "lightblue", high = "darkblue") +
  scale_size(range = c(2, 8)) +
  labs(
    title = "使用 ggplot2 绘制的散点图",
    x = "数学成绩",
    y = "英语成绩",
    color = "学习时长",
    size = "学习时长"
  ) +
  theme_minimal()
  • aes() 定义了映射关系:x、y、颜色、大小都绑定到数据变量。
  • geom_point() 添加点图层。
  • scale_color_gradient() 设置颜色渐变,从浅蓝到深蓝。
  • scale_size() 控制点的大小范围。
  • labs() 设置标题和图例标签。
  • theme_minimal() 使用简洁主题,提升视觉美感。

相比基础 plot()ggplot2 的优势在于:分层构建、可复用、可扩展性强,适合复杂图表和报告。

数据洞察:从散点图中读取信息

一张好的 R 绘图 – 散点图,不只是“好看”,更要“有用”。我们要学会从中提取信息:

观察特征 意义说明
点呈上升趋势 两变量可能存在正相关
点呈下降趋势 两变量可能存在负相关
点分布散乱 两变量关系较弱或无相关
出现明显离群点 可能是数据错误或特殊案例
点形成集群 可能存在不同群体或分组

例如,如果发现某个点远离其他点,且学习时长极短但成绩极高,这可能是一个“学霸”案例,值得深入分析。

总结:掌握 R 绘图 – 散点图的实践路径

从今天的学习中,我们一步步掌握了 R 绘图 – 散点图的核心技能:从基础 plot() 函数,到自定义样式,再到使用 ggplot2 实现专业级图表。你已经具备了在真实项目中使用散点图分析数据关系的能力。

记住,图表不是装饰品,而是“数据语言”。当你能用一张图讲清楚一个故事时,你的分析就真正有价值了。

无论你是初学者还是中级开发者,只要坚持动手实践,把数据变成图形,你就能在数据分析的道路上走得更远。现在,不妨打开 RStudio,用你的真实数据试一试吧。