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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:04:07