R语言绘制温度时序图时X轴显示NA的问题排查与解决
土壤温度拟合曲线X轴NA值问题排查与解决
问题背景
尝试用ggplot2绘制土壤平均温度随采样日期变化的拟合曲线,但将X轴采样日期设为因子后,X轴持续显示NA值,需排查原因并实现X轴按时间先后排序。
数据结构
dput(Average_temperature_period) structure(list(Sample = c("ZS_IG_1", "AK_SN_1", "JP_IG_2", "AW_IG_1", "SBB_SN_1", "AW_IG_2", "JvH_IG_3", "JvH_IG_2", "SBB_SN_4", "SBB_SN_3", "SBB_SN_2", "EF_SN_1", "JP_IG_2", "JvH_IG_3", "EF_SN_1", "JvH_IG_2", "AK_SN_1", "ZS_IG_1", "AW_IG_1", "SBB_SN_1", "AW_IG_2", "SBB_SN_4", "SBB_SN_3", "SBB_SN_2"), Sampling_date = c("23/03/2022", "24/03/2022", "25/03/2022", "25/03/2022", "25/03/2022", "25/03/2022", "29/03/2022", "29/03/2022", "01/04/2022", "01/04/2022", "01/04/2022", "12/04/2022", "25/04/2022", "26/04/2022", "28/04/2022", "29/04/2022", "03/05/2022", "04/05/2022", "10/05/2022", "10/05/2022", "11/05/2022", "11/05/2022", "12/05/2022", "12/05/2022"), Period = c("March", "March", "March", "March", "March", "March", "March", "March", "March", "March", "March", "March", "AprilMay", "AprilMay", "AprilMay", "AprilMay", "AprilMay", "AprilMay", "AprilMay", "AprilMay", "AprilMay", "AprilMay", "AprilMay", "AprilMay"), Average_temperature_field = c(7.137037037, 6.966666667, 10.55555556, 7.281481481, 6.874074074, 9.211111111, 9.662962963, 8.12962963, 6.707407407, 6.774074074, 7.162962963, 8.114814815, NA, 11.74814815, 13.51111111, 11.29259259, 15.4962963, NA, 15.45925926, 17.14814815, 17.72592593, 15.84074074, 16.85555556, 19.78148148), Average_moisture_field = c(33.48518519, 47.35555556, 32.54814815, 34.01851852, 38.66666667, 31.71851852, 23.54814815, 26.83333333, 42.47777778, 29.45555556, 44.50740741, 40.27407407, 25.77407407, 18.91481481, 26.67777778, 16.27407407, 25.38518519, 19.9962963, 18.27777778, 16.14074074, 22.86666667, 23.48518519, 13.93703704, 20.92222222)), row.names = c(NA, 24L), class = "data.frame")
现有代码
##### Soil temperature graph Average_temperature_period <- read.csv("~/Desktop/First Internship/MicroResp/R/R script/Average_temperature_period.csv") Average_temperature_period$Sampling_date <- as.character(Average_temperature_period$Sampling_date) Average_temperature_period <- Average_temperature_period[c(1:24),c(1:5)] # Change order x axis (past to present) Average_temperature_period$Sampling_date <- factor(Average_temperature_period$Sampling_date, levels = c("23/03/22","24/03/22","25/03/22","29/03/22","01/04/22","12/04/22","25/04/22","26/04/22","28/04/22","29/04/22","03/05/22","04/05/22","10/05/22","11/05/22","12/05/22")) # Plot average temperature against the date ggplot(data=Average_temperature_period, aes(x=Sampling_date, y=Average_temperature_field)) + geom_smooth(method = "lm", se=FALSE, color="black", aes(group=1)) + theme_classic() + ylab("Average soil temperature (°C)") + xlab("Sampling date")
问题原因
设置因子时使用的日期格式(如"23/03/22")与原数据的四位年份格式("23/03/2022")完全不匹配,导致所有日期无法匹配到因子水平,最终被识别为NA。此外,手动指定因子levels容易出错,优先使用R原生日期类型处理时间序列数据更稳妥。
修正方案与代码
推荐方案:转换为日期类型处理
将字符型日期转换为R原生日期类型,ggplot会自动按时间顺序排列X轴,同时避免格式不匹配问题:
##### 修正后的土壤温度绘图代码 library(ggplot2) # 读取数据(若未加载可执行此步) # Average_temperature_period <- read.csv("~/Desktop/First Internship/MicroResp/R/R script/Average_temperature_period.csv") # 将字符型日期转换为R日期类型,指定格式为日/月/年 Average_temperature_period$Sampling_date <- as.Date(Average_temperature_period$Sampling_date, format = "%d/%m/%Y") # 按日期升序排序数据(确保绘图顺序正确) Average_temperature_period <- Average_temperature_period[order(Average_temperature_period$Sampling_date), ] # 绘制拟合曲线 ggplot(data = Average_temperature_period, aes(x = Sampling_date, y = Average_temperature_field)) + geom_smooth(method = "lm", se = FALSE, color = "black") + theme_classic() + ylab("Average soil temperature (°C)") + xlab("Sampling date") + # 可选:自定义X轴日期显示格式,例如显示为"日-月" scale_x_date(date_labels = "%d-%m")
备选方案:修正因子格式(不推荐)
如果坚持使用因子,需保证因子levels的格式与原数据完全一致,同时手动按时间顺序排序levels:
# 获取原数据中所有唯一日期 unique_dates <- unique(Average_temperature_period$Sampling_date) # 将日期转换为日期类型排序后再转回字符,得到正确顺序的levels sorted_dates <- as.character(sort(as.Date(unique_dates, format = "%d/%m/%Y"))) # 设置因子,levels为排序后的日期 Average_temperature_period$Sampling_date <- factor(Average_temperature_period$Sampling_date, levels = sorted_dates) # 绘图代码(此时X轴不会显示NA) ggplot(data=Average_temperature_period, aes(x=Sampling_date, y=Average_temperature_field)) + geom_smooth(method = "lm", se=FALSE, color="black", aes(group=1)) + theme_classic() + ylab("Average soil temperature (°C)") + xlab("Sampling date")
内容的提问来源于stack exchange,提问作者Stefanie van den Berg
相关产品推荐
相关产品推荐

