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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:09:05