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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:22:52