You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:07:37