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

