如何在ggplot2中显示指数拟合方程而非线性方程?
问题:指数拟合曲线已绘制,但图表显示线性公式,如何显示指数拟合方程
我尝试为散点拟合指数曲线,曲线已成功绘制,但图表中显示的却是线性公式,想寻求方法让图中显示指数拟合方程。
数据
Nu treat pH Cd 1 Soil 6.1 0.28 2 Soil 6.1 0.29 3 Soil 6.1 0.28 4 Soil 6.1 0.28 5 Soil1 6.9 0.10 6 Soil1 6.6 0.16 7 Soil1 6.9 0.15 8 Soil1 6.6 0.11 9 Soil2 7.0 0.15 10 Soil2 7.1 0.13 11 Soil2 7.0 0.13 12 Soil2 7.2 0.13
当前使用的代码
my.formula= y ~ exp(1.5*-x) Pot=data[c(1:12),] library(ggplot2) library(ggpmisc) ggplot(data=data, aes(x=pH,y=Cd,col="treat"))+ geom_point( size=4, data = Pot, shape=16)+labs(x="pH", y=expression(Cd~~~mg~(kg~soil)^{-1}))+ geom_smooth(data = subset(data, Nu %in% c(1:12)),formula= y ~ exp(1.5*-x), method = "lm", se=F, level=0.95,size=0.5,linetype="dashed", col="black")+ stat_poly_eq(data = subset(data, Nu=1:12),formula= y ~ exp(1.5*-x),aes(label=paste( ..eq.label.., ..rr.label.., sep="~~~")) , label.x.npc = "left", label.y.npc = 0.1, parse=T, size=6, col="black")
解决方案
问题出在stat_poly_eq是为多项式拟合设计的,无法正确解析指数形式的公式标签。下面提供两种可行方案:
方案1:拟合真正的指数模型并自动显示方程(推荐)
使用nls方法拟合标准指数模型y = exp(a + b*x),搭配ggpmisc的stat_fit_eq生成指数形式的方程标签,这是更严谨的拟合方式:
library(ggplot2) library(ggpmisc) # 构造数据框 data <- data.frame( Nu = 1:12, treat = c(rep("Soil",4), rep("Soil1",4), rep("Soil2",4)), pH = c(6.1,6.1,6.1,6.1,6.9,6.6,6.9,6.6,7.0,7.1,7.0,7.2), Cd = c(0.28,0.29,0.28,0.28,0.10,0.16,0.15,0.11,0.15,0.13,0.13,0.13) ) Pot <- data[1:12,] ggplot(data = Pot, aes(x = pH, y = Cd)) + geom_point(size = 4, shape = 16, aes(color = treat)) + labs(x = "pH", y = expression(Cd~~~mg~(kg~soil)^{-1})) + # 拟合指数模型,设置参数初始值(根据数据趋势估计) geom_smooth(formula = y ~ exp(a + b*x), method = "nls", method.args = list(start = list(a = 1, b = -0.5)), se = F, size = 0.5, linetype = "dashed", col = "black") + # 自动生成指数方程和R²标签 stat_fit_eq(formula = y ~ exp(a + b*x), aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), parse = TRUE, label.x.npc = "left", label.y.npc = 0.1, size = 6, col = "black")
说明:
method = "nls"用于非线性最小二乘拟合,需要给参数a和b设置初始值(start参数),可根据数据趋势调整;stat_fit_eq专门适配非多项式拟合,能正确解析指数形式的公式,生成可解析的LaTeX标签,配合parse = TRUE就能显示标准的指数方程。
方案2:手动添加固定参数的指数方程标签
如果坚持使用固定参数的曲线(y ~ exp(1.5*-x)),可以用annotate手动构造标签:
library(ggplot2) library(ggpmisc) data <- data.frame( Nu = 1:12, treat = c(rep("Soil",4), rep("Soil1",4), rep("Soil2",4)), pH = c(6.1,6.1,6.1,6.1,6.9,6.6,6.9,6.6,7.0,7.1,7.0,7.2), Cd = c(0.28,0.29,0.28,0.28,0.10,0.16,0.15,0.11,0.15,0.13,0.13,0.13) ) Pot <- data[1:12,] # 先计算R²值 fit_r2 <- round(summary(lm(Cd ~ exp(-1.5*pH), data=Pot))$r.squared, 3) ggplot(data = Pot, aes(x = pH, y = Cd)) + geom_point(size = 4, shape = 16, aes(color = treat)) + labs(x = "pH", y = expression(Cd~~~mg~(kg~soil)^{-1})) + geom_smooth(formula = y ~ exp(1.5*-x), method = "lm", se = F, size = 0.5, linetype = "dashed", col = "black") + # 手动添加指数方程标签 annotate("text", x = min(Pot$pH), y = 0.1, label = "y == exp(-1.5*x)", parse = TRUE, size = 6, col = "black") + # 手动添加R²标签 annotate("text", x = min(Pot$pH), y = 0.08, label = paste("R^2 =", fit_r2), parse = TRUE, size = 6, col = "black")
说明:
- 用
annotate直接添加文本,通过parse = TRUE解析LaTeX语法,将方程显示为指数形式; - 提前计算拟合的R²值,再手动添加到图表中。
内容的提问来源于stack exchange,提问作者Shohnazar Hazratqulov
相关产品推荐
相关产品推荐

