如何在R语言绘图中添加幂律模型的最佳拟合非线性线?
在对数x轴散点图中添加幂律拟合线的方法
数据背景
你的数据集满足幂律关系 y = ax^b,具体数据与拟合参数如下:
# 原始数据 x <- c(0.12, 0.46, 0.22, 0.68, 1.25) y <- c(0.042, 0.075, 0.055, 0.089, 0.116) # 拟合得到的幂律参数 a = 0.1053 b = 0.433
你通过 lm(log(y)~log(x)) 完成模型拟合,并用 plot(x, y, log = "x") 绘制了x轴为对数刻度的散点图,但直接用lm相关方法无法添加正确的幂律拟合线,以下是两种可行的解决方式:
方法一:利用已知参数直接绘制拟合线
因为x轴是对数刻度、y轴是普通刻度,需要生成覆盖原数据x范围的连续序列,再通过幂律公式计算对应的拟合y值,最后用lines()添加曲线:
# 绘制原始散点图 plot(x, y, log = "x", pch = 16, col = "steelblue", xlab = "x(对数刻度)", ylab = "y") # 生成平滑的x拟合序列(取100个点让曲线更流畅) x_fit <- seq(min(x), max(x), length.out = 100) # 根据幂律公式计算拟合y值 y_fit <- 0.1053 * (x_fit ^ 0.433) # 添加红色拟合线 lines(x_fit, y_fit, col = "red", lwd = 2)
方法二:从拟合模型中提取参数绘制
如果你不想手动输入a和b,可以直接从你拟合的lm模型中提取参数,转换回原尺度的幂律形式后绘制:
# 拟合对数线性模型 model <- lm(log(y) ~ log(x)) # 从模型中提取参数:截距是log(a),斜率是b log_a <- coef(model)[1] b <- coef(model)[2] a <- exp(log_a) # 转换得到a # 绘制散点图 plot(x, y, log = "x", pch = 16, col = "steelblue", xlab = "x(对数刻度)", ylab = "y") # 生成x序列并计算拟合y值 x_fit <- seq(min(x), max(x), length.out = 100) y_fit <- a * (x_fit ^ b) # 添加绿色拟合线 lines(x_fit, y_fit, col = "darkgreen", lwd = 2)
为什么直接用lm的拟合线无效?
你拟合的是对数转换后的线性模型(log(y) = log(a) + b*log(x)),如果直接用abline(model),它会在对数x轴上绘制对数空间的直线,但原y轴是普通刻度,这条直线在原尺度下并非正确的幂律曲线,因此无法显示你需要的拟合效果。必须转换回原尺度的y值,再用lines()绘制曲线才会正确。
内容的提问来源于stack exchange,提问作者Bob Vaillancourt
相关产品推荐
相关产品推荐

