如何使用ggplot2为给定数据框的分布拟合曲线?
用ggplot2拟合Hour与Fraction分布曲线的方法
嘿,这事儿不难!先确保你已经装好了ggplot2包,要是还没装,先跑这行:
install.packages("ggplot2") library(ggplot2)
接下来基于你给的df数据框,咱们分几种常用的拟合方式来做,你可以根据数据的趋势选合适的:
1. 自动平滑拟合(懒人首选)
ggplot2自带的geom_smooth默认用局部加权回归(Loess),能自动适配数据的局部趋势,还能顺便画出置信区间,非常适合快速看趋势:
ggplot(df, aes(x = hour, y = fraction)) + geom_point(color = "steelblue", size = 2) + # 先把原始数据点画出来 geom_smooth(method = "loess", se = TRUE, color = "firebrick", linewidth = 1) + # 拟合曲线,se=TRUE显示置信区间 labs(title = "Hour vs Fraction (Loess Smoothing)", x = "Hour of Day", y = "Fraction") + theme_minimal()
2. 多项式拟合(适合有明显升降趋势的情况)
如果觉得Loess太“随性”,可以用多项式来拟合,比如三次多项式,指定method = "lm"再加公式就行:
ggplot(df, aes(x = hour, y = fraction)) + geom_point(color = "steelblue", size = 2) + geom_smooth(method = "lm", formula = y ~ poly(x, 3), se = TRUE, color = "darkgreen", linewidth = 1) + labs(title = "Hour vs Fraction (Cubic Polynomial Fit)", x = "Hour of Day", y = "Fraction") + theme_minimal()
3. 自定义非线性拟合(适配你的双峰趋势)
看你的数据,fraction在凌晨和深夜明显偏高,白天很低,典型的双峰分布,咱们可以用两个正态分布叠加的非线性模型来拟合,更贴合数据形态:
# 先拟合非线性模型 bimodal_model <- nls( fraction ~ a*dnorm(hour, mean = peak1, sd = sd1) + b*dnorm(hour, mean = peak2, sd = sd2), data = df, start = list(a = 0.1, peak1 = 3, sd1 = 2, b = 0.03, peak2 = 23, sd2 = 1) # 初始参数猜个大概就行 ) # 生成拟合曲线的预测数据,让曲线更平滑 pred_data <- data.frame(hour = seq(0, 23, by = 0.1)) pred_data$fraction <- predict(bimodal_model, newdata = pred_data) # 绘图 ggplot(df, aes(x = hour, y = fraction)) + geom_point(color = "steelblue", size = 2) + geom_line(data = pred_data, color = "purple", linewidth = 1) + labs(title = "Hour vs Fraction (Bimodal Nonlinear Fit)", x = "Hour of Day", y = "Fraction") + theme_minimal()
小提醒:
- 要是不想看置信区间,把
geom_smooth里的se改成FALSE就行。 - 选哪种拟合方法,主要看数据趋势:Loess适合局部波动大的,多项式适合有规律升降的,非线性模型适合有特定形态(比如双峰)的数据。
内容的提问来源于stack exchange,提问作者steves
相关产品推荐
相关产品推荐

