在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
相关产品推荐
相关产品推荐

