使用ggplot2绘制回归直线时“$ operator is invalid”错误求助
修复回归方程标题报错的问题
我来帮你搞定这个$ operator is invalid for atomic vectors错误!咱们一步步拆解问题和解决方案:
错误根源
你调用eq(x)时,传入的是原子向量x,但你的eq()函数里用了coef(x)和summary(x)$r.squared——这两个函数都是给**线性模型对象(lm类)**用的,直接传数值向量肯定会报错。另外你的eq()函数还有两处语法错误:substitute语句缺了括号,as.ep是拼写错误(应该是as.expression)。
修复方案
1. 重新设计eq()函数
让函数接收一个拟合好的线性模型对象,而不是单独的x向量,同时修正语法错误,还可以把R²也加入标题:
eq <- function(lm_model) { lm_coef <- list( a = round(coef(lm_model)[2], digits = 2), b = round(coef(lm_model)[1], digits = 2), r2 = round(summary(lm_model)$r.squared, digits = 2) ) # 生成包含R²的回归方程文本 lm_eq <- substitute(y == a * x + b ~~ (R^2 == r2), lm_coef) as.character(as.expression(lm_eq)) }
2. 调整绘图代码
因为你用了scale_y_log10(),所以需要先拟合对应对数转换后的y的线性模型,再把模型传给eq()函数:
library(ggplot2) x <- c(1,2,2,2,3,3,4,5,5,6,6,6,6,7,8,9,9,11,11,11,15,15,16,16,16,16,17,18,18,18) y <- c(1,2,4,3,3,2,5,4,6,3,7,7,6,7,8,4,5,4,9,9,13,14,15,15,15,16,17,19,19,20) # 拟合与geom_smooth对应的线性模型(log10(y)~x) fit_model <- lm(log10(y) ~ x) p <- ggplot(data = NULL, aes(x = x, y = y)) + geom_point() + geom_smooth(method = lm, se = FALSE, color = "black") + scale_y_log10() + ggtitle(eq(fit_model)) + theme(plot.title = element_text(hjust = 0.5, size = 20)) p
这样运行后,你就能得到带有正确回归方程(包含R²)的散点图,再也不会报错啦!
内容的提问来源于stack exchange,提问作者Wapitix
相关产品推荐
相关产品推荐

