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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:15:36