如何在ggplot2中添加手动指定参数的自定义非线性拟合线?
手动指定参数在ggplot2中添加非线性拟合线的解决方案
该需求完全可以实现,你遇到的报错均为代码参数写法错误导致,具体解决方法如下:
报错原因说明
- 第一个
formal argument "data" matched by multiple actual arguments报错:你在method.args中手动传入了data = data,但geom_smooth已经自动将当前图层关联的数据集传递给nls方法,导致data参数被重复赋值。同时你误将color = blue放在了传给nls的参数列表中,nls本身不识别绘图相关参数,也会引发参数匹配错误。 - 第二个
'what' must be a function or character string报错:大概率是调整代码时漏写了method = "nls"的引号,或者传入的method参数不是合法的函数字符串/函数对象。
最优解决方案:使用geom_function直接绘制自定义函数
你的需求是预设所有模型参数,不需要自动拟合,完全不需要调用用于参数拟合的nls方法,直接用geom_function绘制指定函数即可,写法更简单也不会有拟合类报错,同时支持添加任意数量的自定义模型线:
library(ggplot2) ggplot(cars, aes(x = speed, y = dist)) + geom_point() + # 第一条自定义参数的指数模型线 geom_function(fun = function(x) 0.76*exp(x*0.5), color = "blue", linewidth = 1) + # 第二条自定义参数的模型线,可自行新增任意数量 geom_function(fun = function(x) 0.6*exp(x*0.45), color = "red", linewidth = 1)
如果使用的是R 4.1及以上版本,可以用简写的匿名函数写法:fun = \(x) 0.76*exp(x*0.5)
必须使用nls方法的修正写法
如果有特殊需求必须通过nls实现,需要修正参数写法,固定所有待估参数的上下限即可强制nls使用你指定的参数值:
ggplot(cars, aes(x = speed, y = dist)) + geom_point() + geom_smooth( method = "nls", formula = y ~ a*exp(x*b), method.args = list( start = list(a = 0.76, b = 0.5), # 固定参数不拟合 algorithm = "port", lower = list(a = 0.76, b = 0.5), upper = list(a = 0.76, b = 0.5) ), se = FALSE, # 关闭置信区间 color = "blue" )
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

