在R语言中如何将POSIXct时间序列轴扩展至数据结束时间之后
问题描述
某台温度记录仪提前停止记录,导致其绘图的X轴长度与其他记录仪的X轴不一致。希望将该X轴扩展至统一长度,结束时间设为2022-06-06 00:00:00,以便将多张图并排展示。以下是用于数据转换和绘图的三段核心代码,恳请提供调整建议:
代码片段1:日期时间格式转换
SD1b <- SaxDeep1b SD1b$datetime <- as.POSIXct(strptime(SD1b$datetime,format="%d/%m/%Y %H:%M",tz="Australia/Brisbane")) head(SD1b)
代码片段2:小时级数据聚合
SD1comb$datehour <- cut(as.POSIXct(SD1comb$datetime, format="%Y-%m-%d %H:%M:%S"),breaks="hour") SD1hourlyT <- aggregate(temp ~ datehour,SD1comb,mean) head(SD1hourlyT) SD1hourlyT$datehour <- as.POSIXct(strptime(SD1hourlyT$datehour,format = "%Y-%m-%d %H", tz="Australia/Brisbane")) str(SD1hourlyT)
代码片段3:绘图代码
jpeg(file='SD1_temp.jpeg',width=19,height=10,res=1200,units="cm") SD1temp <- ggplot(SD1hourlyT, aes(x = datehour, y = temp)) + geom_line(colour="black") + labs(x=element_blank(),y=expression("Temperature " ( degree*C)) ) + scale_x_datetime(date_breaks="1 month",date_labels = "%b") + #see ?strptime for labs scale_y_continuous(limits=c(23,33),breaks=c(23,25,27,29,31,33)) + theme_linedraw() + theme_minimal()+ theme(axis.text.x = element_text(colour="black",size=10), axis.title.x = element_text(color = "black", size=12), panel.grid.major = element_line(colour = "#d3d3d3"), panel.grid.minor = element_blank(), axis.text.y = element_text(colour="black",size=10), axis.title.y = element_text(color = "black", size=12)) + ggtitle("Saxon Deep 1")
调整建议
方法一:直接指定X轴范围(快速实现)
在scale_x_datetime中添加limits参数,强制X轴结束时间为目标时间,同时保留数据的起始时间,这样所有图的X轴长度就能统一。
修改后的绘图代码:
jpeg(file='SD1_temp.jpeg',width=19,height=10,res=1200,units="cm") SD1temp <- ggplot(SD1hourlyT, aes(x = datehour, y = temp)) + geom_line(colour="black") + labs(x=element_blank(),y=expression("Temperature " ( degree*C)) ) + scale_x_datetime( date_breaks="1 month", date_labels = "%b", # 固定X轴结束时间,起始时间用数据最早值 limits = c(min(SD1hourlyT$datehour), as.POSIXct("2022-06-06 00:00:00", tz="Australia/Brisbane")) ) + scale_y_continuous(limits=c(23,33),breaks=c(23,25,27,29,31,33)) + theme_linedraw() + theme_minimal()+ theme(axis.text.x = element_text(colour="black",size=10), axis.title.x = element_text(color = "black", size=12), panel.grid.major = element_line(colour = "#d3d3d3"), panel.grid.minor = element_blank(), axis.text.y = element_text(colour="black",size=10), axis.title.y = element_text(color = "black", size=12)) + ggtitle("Saxon Deep 1") dev.off() # 务必关闭绘图设备
方法二:补全缺失时间序列(更严谨)
如果希望在记录仪停止后的时间段显示空白(而非直接拉伸轴),可以先补全从数据起始到目标结束时间的所有小时级时间点,再合并原数据,缺失温度值设为NA。
- 生成完整时间序列
# 获取数据起始时间 start_time <- min(SD1hourlyT$datehour) # 生成从起始到目标结束时间的每小时序列 full_time_seq <- seq(start_time, as.POSIXct("2022-06-06 00:00:00", tz="Australia/Brisbane"), by="hour") full_time_df <- data.frame(datehour = full_time_seq)
- 合并原数据与完整序列
# 左连接保留所有时间点,缺失温度设为NA SD1hourlyT_full <- merge(full_time_df, SD1hourlyT, by="datehour", all.x=TRUE)
- 使用补全后的数据集绘图
jpeg(file='SD1_temp.jpeg',width=19,height=10,res=1200,units="cm") SD1temp <- ggplot(SD1hourlyT_full, aes(x = datehour, y = temp)) + geom_line(colour="black") + labs(x=element_blank(),y=expression("Temperature " ( degree*C)) ) + scale_x_datetime(date_breaks="1 month",date_labels = "%b") + scale_y_continuous(limits=c(23,33),breaks=c(23,25,27,29,31,33)) + theme_linedraw() + theme_minimal()+ theme(axis.text.x = element_text(colour="black",size=10), axis.title.x = element_text(color = "black", size=12), panel.grid.major = element_line(colour = "#d3d3d3"), panel.grid.minor = element_blank(), axis.text.y = element_text(colour="black",size=10), axis.title.y = element_text(color = "black", size=12)) + ggtitle("Saxon Deep 1") dev.off()
注意事项
- 所有绘图务必统一使用
"Australia/Brisbane"时区,避免时间偏移 - 若要统一所有图的X轴起始时间,可将
min(SD1hourlyT$datehour)替换为所有数据集的共同起始点,比如as.POSIXct("2022-01-01 00:00:00", tz="Australia/Brisbane")
内容的提问来源于stack exchange,提问作者Justin B
相关产品推荐
相关产品推荐

