如何从geom_smooth(method=loess)生成的平滑折线图提取365个值?
高效提取365个每日温度预测值的方法
不用从控制台逐个提取,直接通过loess模型拟合+预测的方式就能快速生成365个每日温度值,步骤如下:
1. 直接拟合loess模型并预测
这是最可靠高效的方式,跳过ggplot绘图环节,直接对原始数据建模:
示例代码
# 替换成你实际的4个数据点 original_data <- data.frame( day_of_year = c(1, 90, 180, 270), # 一年中的第1、90、180、270天 temperature = c(5, 15, 25, 12) # 对应温度值 ) # 拟合loess模型,span参数控制平滑程度(小数据集建议设为1,避免警告) loess_fit <- loess(temperature ~ day_of_year, data = original_data, span = 1) # 生成1-365天的预测序列 daily_days <- data.frame(day_of_year = 1:365) daily_temps <- predict(loess_fit, newdata = daily_days) # 整理成最终的每日温度数据框 daily_temp_data <- cbind(daily_days, temperature = daily_temps)
2. 若已生成ggplot对象,可直接提取拟合数据
如果已经用geom_smooth画出了图,也能从ggplot对象里提取拟合后的数据集,不过默认生成的x值可能不是恰好1-365,建议再做一次插值:
library(ggplot2) # 假设你已有的ggplot图 p <- ggplot(original_data, aes(x=day_of_year, y=temperature)) + geom_point() + geom_smooth(method = "loess", span = 1) # 提取geom_smooth的拟合数据 smooth_fit_data <- ggplot_build(p)$data[[2]] # 基于拟合数据插值生成1-365天的温度值 library(zoo) daily_interp <- approx(smooth_fit_data$x, smooth_fit_data$y, xout = 1:365) daily_temp_data <- data.frame(day_of_year = daily_interp$x, temperature = daily_interp$y)
关键提示
- 调整
span参数可以控制曲线平滑度:值越大曲线越平滑,小数据集设为1能避免"小数据集"警告,同时保证拟合结果贴合你的4个数据点。 - 直接用
loess()+predict()的方式比从图中提取数据更灵活,还能随时调整模型参数优化拟合效果。
内容的提问来源于stack exchange,提问作者EcoQuestions
相关产品推荐
相关产品推荐

