如何在ggplot中绘制二次平台曲线?解决绘图报错问题
解决ggplot中geom_smooth绘制nls二次平台曲线的报错问题
问题背景
已生成数据集并拟合二次平台nls模型,但调用geom_smooth(method="nls")时出现如下报错,无法显示拟合的二次平台曲线:
Warning message: Computation failed in `stat_smooth()` Caused by error in `getInitial.default()`: ! no 'getInitial' method found for "function" objects
错误原因
geom_smooth的formula参数需传入公式表达式,而非已拟合的nls对象(fm)- 自定义的
Mean函数属于用户自定义模型,ggplot无法自动获取模型的初始参数值,导致getInitial函数触发报错
解决方案
方案1:直接在geom_smooth中配置nls参数
在geom_smooth中明确指定模型公式、自定义函数,并通过method.args传入初始参数值(可使用已拟合模型的参数估计值作为初始值,提升拟合稳定性):
# 定义二次平台函数 Mean <- function(x, alpha, beta, gamma) { pmin(alpha + beta*x + gamma*x*x, alpha - beta^2/(4 * gamma)) } # 绘图代码 ggplot(data=dataA, aes(x=GN, y=Yield))+ geom_smooth(method="nls", formula=y ~ Mean(x, alpha, beta, gamma), method.args = list(start = list(alpha = -5, beta = 19, gamma = -0.8)), level=0.95, se=FALSE, linetype=1, size=1, color="Red") + geom_point(col="Black", size=4) + scale_x_continuous(breaks = seq(0,15,3), limits = c(0,15)) + scale_y_continuous(breaks = seq(0,120,20), limits = c(0,120)) + labs(x="籽粒数量", y="产量") + theme_grey(base_size=17, base_family="serif")+ theme(axis.line= element_line(size=0.5, colour="black"))+ windows(width=5.5, height=5)
方案2:先预测拟合值,再用geom_line绘制
利用已拟合好的fm模型生成平滑的预测数据,再通过geom_line添加曲线,无需重复拟合模型:
# 生成覆盖原x范围的平滑序列 new_x <- seq(min(dataA$GN), max(dataA$GN), length.out=100) # 基于拟合模型预测y值 pred_y <- predict(fm, newdata = list(x=new_x)) # 构建预测数据集 pred_data <- data.frame(GN=new_x, Yield=pred_y) # 绘图 ggplot(data=dataA, aes(x=GN, y=Yield))+ geom_point(col="Black", size=4) + geom_line(data=pred_data, color="Red", size=1, linetype=1) + scale_x_continuous(breaks = seq(0,15,3), limits = c(0,15)) + scale_y_continuous(breaks = seq(0,120,20), limits = c(0,120)) + labs(x="籽粒数量", y="产量") + theme_grey(base_size=17, base_family="serif")+ theme(axis.line= element_line(size=0.5, colour="black"))+ windows(width=5.5, height=5)
内容的提问来源于stack exchange,提问作者J.K Kim
相关产品推荐
相关产品推荐

