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

如何在ggplot2绘制的指数衰减拟合图中添加拟合方程?

解决指数衰减拟合(含半衰期k)的ggplot2标注问题

步骤1:加载依赖包与读取数据

library(tidyverse)
# 读取本地数据集(替换为你的文件路径)
df <- read.csv("sample_data_trasport.csv")

步骤2:拟合含半衰期的指数衰减模型

指数衰减的标准形式为 y = a * exp(-k*x),其中半衰期计算公式为 t₁/₂ = ln(2)/k。用nls拟合时需指定初始参数值避免收敛失败:

# 通过对数转换线性模型获取初始参数(解决nls收敛问题)
lm_log <- lm(log(y) ~ x, data = df)
start_vals <- list(a = exp(coef(lm_log)[1]), k = -coef(lm_log)[2])

# 拟合指数衰减nls模型
decay_model <- nls(y ~ a * exp(-k * x), data = df, start = start_vals)

步骤3:提取参数并生成带半衰期的方程文本

提取模型的a和k参数,计算半衰期后格式化方程文本:

params <- coef(decay_model)
half_life <- log(2)/params["k"]

# 格式化方程(保留3位小数)
equation_text <- paste0(
  "y = ", round(params["a"], 3), "·e^(-", round(params["k"], 3), "x)\n",
  "半衰期 t₁/₂ = ", round(half_life, 3)
)

步骤4:用ggplot2绘制并添加拟合线与方程

ggplot(df, aes(x = x, y = y)) +
  geom_point(color = "steelblue", size = 2) +
  # 添加指数衰减拟合线
  geom_smooth(method = "nls", formula = y ~ a * exp(-k * x), 
              method.args = list(start = start_vals),
              se = FALSE, color = "firebrick", linewidth = 1) +
  # 添加方程文本(可调整x/y值改变位置)
  annotate("text", x = max(df$x)*0.7, y = max(df$y)*0.8, 
           label = equation_text, hjust = 0, size = 4, 
           family = "mono") +
  theme_minimal() +
  labs(x = "自变量X", y = "因变量Y")

常见问题处理

  • 若nls收敛失败:改用nlme包的gnls函数,或asymReg包的nls2进行全局初始值搜索
  • 文本位置不合适:修改annotate中的x和y参数,调整到图中空白区域

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:22:24