如何在R中平滑数据并导出至新数据框后绘制图形?
解决方法:提取Loess平滑值并存储到数据框
嗨,刚好能帮到你!你已经找到了最适合的Loess平滑参数(y~log(x),span=0.05),现在只需要把geom_smooth背后的计算结果提取出来,就能得到带平滑值的数据框,后续分析和绘图都能用。下面是具体步骤:
1. 拟合Loess模型并生成平滑值
geom_smooth(method="loess")本质上是调用了R基础包的loess()函数,所以我们直接用这个函数拟合模型,再通过predict()得到对应每个x的平滑y值:
library(ggplot2) library(dplyr) library(plotly) # 读取数据并采样(沿用你原来的代码) df <- read.csv("data.csv", header = T) rs <- sample_n(df,715) # 1. 拟合Loess模型,参数和你用geom_smooth时完全一致 loess_fit <- loess(y ~ log(x), data = rs, span = 0.05) # 2. 对采样数据按x排序(避免绘图时曲线乱序),并添加平滑值列 rs_with_smooth <- rs %>% arrange(x) %>% mutate(y_smooth = predict(loess_fit, newdata = .))
这样rs_with_smooth就是包含原始数据和平滑值的新数据框,y_smooth列就是你之前在geom_smooth里看到的那条曲线的对应数值。
2. 基于平滑后的数据框绘图
现在用这个新数据框绘图,既能展示原始数据,也能展示平滑曲线,和你之前的可视化效果完全一致,还能保留平滑值用于后续分析:
# 绘制原始线+平滑线 p <- ggplot(rs_with_smooth, aes(x = x)) + geom_line(aes(y = y), color = "lightgray", alpha = 0.6, linewidth = 0.8) + geom_line(aes(y = y_smooth), color = "#2E86AB", linewidth = 1) + labs(title = "原始数据与Loess平滑结果", x = "X轴", y = "Y轴") # 转成交互式plotly图(可选) ggplotly(p)
可选:生成更密集的平滑曲线
如果想要更顺滑的曲线,可以手动生成一组更密集的x值,再预测平滑值:
# 生成1000个均匀分布的x点 dense_x <- seq(min(rs$x), max(rs$x), length.out = 1000) dense_smooth <- data.frame(x = dense_x) %>% mutate(y_smooth = predict(loess_fit, newdata = .)) # 绘图时结合原始数据和密集平滑曲线 ggplot() + geom_line(data = rs, aes(x, y), color = "lightgray", alpha = 0.6) + geom_line(data = dense_smooth, aes(x, y_smooth), color = "#2E86AB", linewidth = 1)
这样就完美解决了“只能看图不能拿数据”的问题,所有平滑值都存在数据框里啦!
内容的提问来源于stack exchange,提问作者Hanif Shidki
相关产品推荐
相关产品推荐

