R语言:如何在ggplot2中绘制x轴为不同日期的多折线图?
儿童字母认知发展纵向研究折线图绘制需求
我开展了一项儿童字母认知发展的纵向研究,120名儿童在三个不同时间点完成了字母认知任务。数据集df的前6行如下:
> head(df) id T1_date T1_letters T2_date T2_letters T3_date T3_letters 1 101 2022-10-17 4 2023-05-15 18 2023-12-11 26 2 102 2022-10-18 9 2023-05-15 20 2023-12-11 30 3 103 2022-10-17 14 2023-05-15 30 2023-12-11 30 4 104 2022-10-18 7 2023-05-15 17 2023-12-11 27 5 105 2022-10-17 1 2023-05-16 11 2023-12-12 26 6 106 2022-10-17 2 2023-05-15 11 2023-12-12 26
数据集第一列id为被试编号,各时间点测试日期存在细微差异,不同儿童的同一时间点测试日期可能不同。
绘制要求:
- 每个儿童对应一条细折线(共120条),连接其三个时间点的分数
- x轴为测试日期,y轴为字母认知分数(分值范围0-34,包含二合字母)
- 初始所有折线使用黑色,需保留后续修改特定被试折线颜色的选项
数据集完整结构:
df = structure(list(id = c(101, 102, 103, 104, 105, 106, 201, 202, 203, 204, 205), T1_date = c("2022-10-17", "2022-10-18", "2022-10-17", "2022-10-18", "2022-10-17", "2022-10-17", "2022-12-01", "2022-12-01", "2022-12-01", "2022-11-23", "2022-11-23"), T1_letters = c(4, 9, 14, 7, 1, 2, 3, 8, 0, 3, 8), T2_date = c("2023-05-15", "2023-05-15", "2023-05-15", "2023-05-15", "2023-05-16", "2023-05-15", "2023-03-28", "2023-03-28", "2023-03-29", "2023-03-27", "2023-03-27"), T2_letters = c(18, 20, 30, 17, 11, 11, 4, 14, 4, 8, 8), T3_date = c("2023-12-11", "2023-12-11", "2023-12-11", "2023-12-11", "2023-12-12", "2023-12-12", "2023-09-21", "2023-09-21", "2023-09-21", "2023-09-18", "2023-09-18" ), T3_letters = c(26, 30, 30, 27, 26, 26, 10, 18, 8, 16, 18)), row.names = c(NA, -11L), class = "data.frame")
解决方案
步骤1:转换数据为长格式
ggplot2更适配长格式数据,先将宽格式数据集转换为长格式:
library(tidyverse) # 拆分时间点、日期和分数,转换为长格式 df_long <- df %>% pivot_longer( cols = -id, names_to = c("time_point", ".value"), names_pattern = "(T\\d)_(date|letters)" ) %>% mutate(date = as.Date(date)) # 将日期字符串转为日期类型
步骤2:绘制基础折线图
绘制所有被试的细黑折线,设置坐标轴范围和样式:
# 生成基础折线图 p <- ggplot(df_long, aes(x = date, y = letters, group = id)) + geom_line(color = "black", linewidth = 0.3) + # 细黑线避免重叠杂乱 scale_y_continuous(limits = c(0, 34), breaks = seq(0, 34, by = 4)) + # 固定y轴范围 scale_x_date(date_labels = "%Y-%m-%d", date_breaks = "3 months") + # 设置x轴日期格式与间隔 labs( x = "测试日期", y = "字母认知分数", title = "儿童字母认知分数随时间变化趋势" ) + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转x轴标签避免重叠 print(p)
步骤3:修改特定被试折线颜色
通过分层添加geom_line,可以单独修改指定被试的折线样式,不影响基础图层:
# 突出显示id为101和103的被试 p + geom_line(data = filter(df_long, id %in% c(101, 103)), aes(color = factor(id)), linewidth = 0.8) + # 加粗突出 scale_color_manual(values = c("101" = "red", "103" = "blue")) + labs(color = "重点被试ID")
关键说明
- 长格式转换时,通过
names_pattern精准匹配时间点前缀,确保日期与分数一一对应 group = id保证每个被试的折线独立绘制- 细线条(
linewidth=0.3)缓解多线重叠的视觉杂乱问题 - 分层绘图逻辑保留了修改特定被试样式的灵活性,无需重构基础图
内容的提问来源于stack exchange,提问作者BobKap
相关产品推荐
相关产品推荐

