Skip to content

R - 散点图

散点图对于可视化两个连续变量之间的关系至关重要。图上的每个点代表一个观测值,根据其在水平(x)和垂直(y)轴上的值进行定位。虽然 R 的基础图形包(plot())可以创建简单的散点图,但现代、强大且推荐的方法是使用 ggplot2 包。

ggplot2 基于“图形语法”(Grammar of Graphics),这是一种允许您逐层构建图表的理念。关键组成部分包括:

  • data(数据):包含要绘制变量的数据集。
  • aesthetics (aes)(美学映射):变量如何映射到视觉属性,例如 x/y 轴、颜色、大小或形状。
  • geoms(几何对象):表示数据的几何对象,例如点(geom_point)、线(geom_line)或条(geom_bar)。

我们将使用内置的 mtcars 数据集来探索车辆重量(wt)和燃油效率(mpg)之间的关系。

# 如果尚未安装 ggplot2 (tidyverse 的一部分),请安装
# install.packages("tidyverse")
library(ggplot2)
library(dplyr)
# 选择相关列以提高清晰度
input_data <- mtcars %>% select(wt, mpg, cyl, gear)
print(head(input_data))

执行上述代码会产生以下结果:

wt mpg cyl gear
Mazda RX4 2.620 21.0 6 4
Mazda RX4 Wag 2.875 21.0 6 4
Datsun 710 2.320 22.8 4 4
Hornet 4 Drive 3.215 21.4 6 3
Hornet Sportabout 3.440 18.7 8 3
Valiant 3.460 18.1 8 3

以下脚本将创建一个精美的散点图。我们可以使用 + 运算符向图中添加图层。

# 创建散点图对象
scatterplot <- ggplot(data = input_data, aes(x = wt, y = mpg)) +
geom_point() + # 添加点层
labs( # 添加信息性标签
title = "Vehicle Weight vs. Fuel Efficiency (MPG)",
subtitle = "Heavier cars tend to have lower mileage",
x = "Weight (1000 lbs)",
y = "Miles Per Gallon"
) +
theme_minimal() # 应用简洁的现代主题
# 将图表打印到查看器
print(scatterplot)
# 将图表保存到文件
# ggsave 会自动保存最后显示的图表
ggsave("scatterplot.png", width = 8, height = 5)

此代码会生成一个名为 scatterplot.png 的文件,其中包含一个标注清晰的散点图。该图表也会显示在 RStudio 的绘图面板中。

ggplot2 的强大之处在于它能够将其他变量映射到美学属性。例如,我们可以将 cyl(汽缸数)变量映射到 color 美学属性,以观察它如何影响变量间的关系。

# 创建增强型散点图
enhanced_plot <- ggplot(data = input_data, aes(x = wt, y = mpg, color = factor(cyl))) +
geom_point(size = 3, alpha = 0.8) + # 使点更大,并略微透明
geom_smooth(method = "lm", se = FALSE) + # 为每个组添加一条线性回归线
labs(
title = "Vehicle Weight vs. Fuel Efficiency by Cylinder Count",
x = "Weight (1000 lbs)",
y = "Miles Per Gallon",
color = "Cylinders" # 这会重命名图例标题
) +
theme_light()
print(enhanced_plot)
ggsave("scatterplot_enhanced.png", width = 8, height = 5)

注意: 我们使用 factor(cyl) 将汽缸数视为离散分类变量,这适用于颜色映射。

为了同时可视化多个变量之间的关系,基础 R 的 pairs() 函数虽然功能齐全但已过时。现代的、基于 ggplot2 的替代方案是 GGally 包中的 ggpairs() 函数。

# install.packages("GGally")
library(GGally)
# 为选定变量创建散点图矩阵
matrix_plot <- ggpairs(
input_data,
columns = c('mpg', 'wt', 'cyl'),
aes(color = factor(gear), alpha = 0.5), # 全局美学映射
title = "Scatterplot Matrix of Car Performance Metrics"
)
print(matrix_plot)
ggsave("scatterplot_matrix.png", width = 10, height = 10)

ggpairs 图表信息量巨大,显示了:

  • 每对连续变量的散点图。
  • 对角线上的密度图。
  • 连续变量与分类变量配对的箱线图。
  • 相关值。