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

在R语言中如何将日期与实验天数合并到X轴?

在ggplot的X轴同时显示日期与实验天数

需求背景

现有如下数据集,包含采样日期(Sampling_date)、实验天数(Day)和气体通量(Gas_Flux)字段:

dataA = data.frame(structure(list(Sampling_date = structure(c(1684368000, 1685318400, 
                                           1685923200, 1686528000, 1687737600, 1688256000, 1688774400, 1689552000, 
                                           1690156800, 1691366400, 1691971200, 1693094400, 1694131200, 1694908800, 
                                           1695340800), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
               Day = c(0, 11, 18, 25, 39, 45, 51, 60, 67, 81, 88, 101, 113, 
                       122, 127), Gas_Flux = c(2, 2.54, 1.96, 0.65, 0.88, 0.93, 
                                               0, 0.75, 0.68, 0.84, 0.78, 0.91, 3.42, 2.3, 0.94)), class = c("tbl_df", 
                                                                                                             "tbl", "data.frame"), row.names = c(NA, -15L)))

已使用ggplot绘制基于日期的折线图,但需要在X轴上同时显示每个日期对应的实验天数,希望将日期与实验天数合并到X轴标签中。现有绘图代码:

ggplot(data=dataA, aes(x=Sampling_date, y=Gas_Flux))+
  geom_line (size=0.5)+
  geom_point(size=5, alpha=0.5) +
  scale_x_datetime(date_breaks = "14 day", date_labels = "%b/%d") +
  scale_y_continuous(breaks = seq(0,5,1), limits = c(0,5)) +
  theme_classic (base_size=20, base_family="serif")+
  theme(legend.position=c(0.93,0.10),
        legend.title=element_blank(),
        legend.key=element_rect(color=alpha("grey",.05), fill=alpha("grey",.05)),
        legend.background= element_rect(fill=alpha("grey",.05)),
        axis.line=element_line(linewidth=0.5, colour="black"))+
windows(width=12, height=8)

解决方案

要实现X轴同时显示日期和实验天数,核心是自定义X轴标签,将日期格式化后与对应的Day字段拼接。以下是两种常用实现方式:

方式1:每个采样点都显示日期+天数

如果需要所有采样日期都作为X轴断点,并显示对应的日期和天数,修改代码如下:

library(ggplot2)

ggplot(data=dataA, aes(x=Sampling_date, y=Gas_Flux))+
  geom_line(size=0.5)+
  geom_point(size=5, alpha=0.5) +
  # 自定义X轴:断点为所有采样日期,标签拼接日期和天数
  scale_x_datetime(
    breaks = dataA$Sampling_date,
    labels = function(x) {
      # 匹配每个日期对应的实验天数
      day_vals = dataA$Day[match(x, dataA$Sampling_date)]
      # 换行显示日期和天数
      paste0(format(x, "%b/%d"), "\n(Day ", day_vals, ")")
    }
  ) +
  scale_y_continuous(breaks = seq(0,5,1), limits = c(0,5)) +
  theme_classic(base_size=20, base_family="serif")+
  theme(
    legend.position=c(0.93,0.10),
    legend.title=element_blank(),
    legend.key=element_rect(color=alpha("grey",.05), fill=alpha("grey",.05)),
    legend.background=element_rect(fill=alpha("grey",.05)),
    axis.line=element_line(linewidth=0.5, colour="black"),
    # 旋转标签避免重叠
    axis.text.x=element_text(angle=45, hjust=1)
  )
windows(width=12, height=8)

方式2:保留14天间隔断点,仅在有采样数据的日期显示天数

如果希望维持原有的14天间隔断点,仅在该断点存在采样数据时显示天数,修改scale_x_datetime部分即可:

scale_x_datetime(
  date_breaks = "14 day",
  labels = function(x) {
    day_vals = dataA$Day[match(x, dataA$Sampling_date)]
    # 仅当日期存在采样数据时拼接天数,否则只显示日期
    ifelse(is.na(day_vals), format(x, "%b/%d"), paste0(format(x, "%b/%d"), "\n(Day ", day_vals, ")"))
  }
)

关键说明

  • breaks参数:控制X轴的显示断点,可根据需求选择所有采样日期或固定间隔日期。
  • labels自定义函数:通过match关联日期与对应的实验天数,用paste0拼接内容,\n实现换行让标签更清晰。
  • axis.text.x调整:旋转标签角度并设置对齐方式,避免标签重叠影响可读性。

内容的提问来源于stack exchange,提问作者J.K Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:46:33