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

如何让ggplot2的geom_smooth绘制双曲线作为拟合曲线?

问题解决:ggplot2用geom_smooth拟合双曲线的方法

问题原因

  • 公式解析错误:R的公式语法中,直接写y ~ 1/x会将1/x识别为交互项运算,而非数学上的1除以x,需要用I()包裹才能按数学运算解析
  • 公式与实际数据规律不匹配:你生成示例数据用的是y ~ x^(-0.2)的幂律双曲线,和y ~ 1/x的倒数双曲线规律不一致
  • 方法选择不适配:gam方法默认对公式有平滑处理逻辑,自定义非线性函数拟合更适合用nls(非线性最小二乘)方法

解决方案

方案1:拟合已知形式的自定义双曲线

如果你已经明确数据符合y = a + b * x^k的幂律双曲线形式,直接用nls方法拟合即可:

n <- 100
x <- seq(n)
y <- rnorm(n, 50 + 30 * x^(-0.2), 1)
Data <- data.frame(x, y)

ggplot(data = Data, 
       aes(x = x, y = y)) +
  geom_point() +
  geom_smooth(se = FALSE, method = "nls", 
              formula = y ~ a + b * x^k,
              # 给参数设置合理的初始猜测值,可根据你的数据调整
              start = list(a = 40, b = 40, k = -0.3),
              color = "red")

拟合得到的参数会非常接近你生成数据时设置的a=50、b=30、k=-0.2,曲线和散点的匹配度很高。

方案2:拟合标准倒数形式双曲线y = a + b/x

如果你需要拟合y ~ 1/x的标准双曲线,只需要修正公式语法即可:

ggplot(data = Data, 
       aes(x = x, y = y)) +
  geom_point() +
  geom_smooth(se = FALSE, method = "lm", 
              # 用I()包裹1/x,确保按数学运算解析
              formula = y ~ I(1/x),
              color = "blue")

这个方案拟合的是y = 截距 + 系数 * (1/x)的标准双曲线,不需要设置初始参数,使用更简便。

内容的提问来源于stack exchange,提问作者Arvid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:39:00