如何让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
相关产品推荐
相关产品推荐

