Skip to content

R - 折线图

折线图是可视化数据随时间或其他连续序列变化的趋势的理想选择。虽然 R 基础包(base R)中提供了 plot() 函数,但要在 R 中创建复杂且达到出版质量的图形,现代化、功能强大且推荐的方法是使用 ggplot2 包。

ggplot2 基于图形语法(Grammar of Graphics),这是一种将图表分解为数据、美学映射(aesthetic mappings)和几何图层(geometric layers)等组成部分的理念。这使其成为一个系统化且灵活的可视化工具。

要使用 ggplot2 创建图表,你需要三个关键组件:

  1. ggplot():主函数,用于指定数据集。
  2. aes():美学映射(aesthetic mappings),定义数据中的变量如何映射到视觉属性(如 x 轴、y 轴、颜色等)。
  3. 几何图层(geom layer):定义图表类型的几何对象(例如,geom_line() 用于折线图,geom_point() 用于散点图)。
# 首先,安装并加载 ggplot2 包(它是 tidyverse 的一部分)
# install.packages("tidyverse")
library(ggplot2)
# 创建一些示例数据:月降雨量(单位:毫米)
monthly_data <- data.frame(
month = 1:12,
rainfall_mm = c(7, 12, 28, 45, 80, 55, 30, 25, 15, 10, 8, 5)
)
# 创建图表
ggplot(data = monthly_data, mapping = aes(x = month, y = rainfall_mm)) +
geom_line()

这段代码生成一个简单的折线图。x 轴代表月份(从 1 到 12),y 轴显示相应的降雨量。一条线按顺序连接所有数据点。

自定义图表:标题、标签和颜色

Section titled “自定义图表:标题、标签和颜色”

你可以通过添加更多图层轻松自定义你的图表。labs() 函数用于添加标题和轴标签。要改变几何对象(geom)的显示效果,你需要将其属性(如 color 或 size)设置在 aes() 函数之外。

ggplot(data = monthly_data, mapping = aes(x = month, y = rainfall_mm)) +
geom_line(color = "steelblue", size = 1.5) + # 设置静态颜色和大小
geom_point(color = "steelblue", size = 3) + # 在线上添加点
labs(
title = "Monthly Rainfall in Fictional City",
subtitle = "A seasonal trend is visible",
x = "Month of the Year",
y = "Rainfall (mm)",
caption = "Source: Fictional Weather Service"
) +
theme_minimal() # 应用简洁主题

这段代码生成一个更加精美的图表。折线和点都采用了令人愉悦的“steelblue”蓝色。图表具有清晰的标题、副标题、信息丰富的轴标签和图注。theme_minimal() 函数为图表赋予了简洁、现代的外观。

使用 ggplot2 绘制多条折线的方式不是逐一添加,而是将数据中的一个分类变量映射到颜色美学(color aesthetic)。这要求你的数据采用“长格式”(long format)或“整洁格式”(tidy format),即每个观测值都有自己的行。

让我们比较两个不同城市的降雨量。首先,我们将创建数据,然后使用 tidyr::pivot_longer() 来重塑它。

library(tidyr)
# 两个城市的“宽格式”数据
wide_data <- data.frame(
month = 1:12,
city_a_rainfall = c(7, 12, 28, 45, 80, 55, 30, 25, 15, 10, 8, 5),
city_b_rainfall = c(90, 85, 60, 40, 25, 15, 10, 12, 20, 35, 65, 80)
)
# 将数据重塑为“长格式”
long_data <- wide_data %>%
pivot_longer(
cols = c(city_a_rainfall, city_b_rainfall), # 需要进行透视的列
names_to = "city", # 用于存储原始列名的新列
values_to = "rainfall" # 用于存储原始值的新列
)
# 现在,通过将 'city' 列映射到颜色美学来创建图表
ggplot(data = long_data, mapping = aes(x = month, y = rainfall, color = city)) +
geom_line(size = 1) +
labs(
title = "Monthly Rainfall Comparison",
x = "Month",
y = "Rainfall (mm)",
color = "City" # 这会重命名图例标题
) +
theme_light()

这段代码生成一个包含两条不同折线的图表,每条代表一个城市。ggplot2 会自动为每条线分配不同的颜色,并创建一个图例来标识哪种颜色对应哪个城市。这种方法具有高度可扩展性——如果你有十个城市,同样的代码将生成一个包含十条折线的图表。

保存 ggplot 图表的最佳方法是使用 ggsave() 函数。它会自动根据文件扩展名(例如 .png、.pdf、.svg)检测文件类型,并保存你最后显示的图表。

# 这会将最后显示的图表保存为名为 'rainfall_comparison.png' 的文件
# ggsave("rainfall_comparison.png", width = 8, height = 5)