ggplot绘制lm回归方程:移除截距与斜率外的c()字符求助
解决ggplot线性模型方程中
c()字符无法去除的问题 我来帮你搞定这个问题!你遇到的c()字符残留问题,本质是从模型里提取的系数还保留着向量属性,导致生成方程字符串时被解析成了向量格式。咱们只需要微调系数提取的方式就能解决:
修改核心函数lm_eqn
关键是把提取到的系数先转换成纯数值类型,再进行格式化,彻底剥离向量属性:
lm_eqn <- function(df){ m <- lm(y ~ x, df); # 新增as.numeric()转换,确保系数是纯数值而非带属性的向量 eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2, list(a = format(as.numeric(coef(m)[1]), digits = 2), b = format(as.numeric(coef(m)[2]), digits = 2), r2 = format(summary(m)$r.squared, digits = 3))) as.character(as.expression(eq)); }
完整可运行代码
把修改后的函数代入你的代码,重新运行就能得到没有c()的干净方程了:
df <- data.frame(x = c(1:100)) df$y <- 2 + 3 * df$x + rnorm(100, sd = 40) lm_eqn <- function(df){ m <- lm(y ~ x, df); eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2, list(a = format(as.numeric(coef(m)[1]), digits = 2), b = format(as.numeric(coef(m)[2]), digits = 2), r2 = format(summary(m)$r.squared, digits = 3))) as.character(as.expression(eq)); } p <- ggplot(data = df, aes(x = x, y = y, label=y))+ geom_smooth(method="lm", se=FALSE)+ geom_point() ymax <- max(df$y)* 0.95 xmean <- mean(df$x) p1 <- p + geom_text(x = xmean, y = ymax, label = lm_eqn(df), parse = TRUE) p1
原理说明
原代码里coef(m)[1]返回的是带名称的数值向量(比如(Intercept) 2.12),直接用format()处理后,向量的结构属性没被完全清除,导致substitute()生成表达式时把它识别为向量,自动加上了c()包裹。而as.numeric(coef(m)[1])会剥离名称属性,只保留纯数值,格式化后就是普通字符串,自然不会再出现c()。
内容的提问来源于stack exchange,提问作者Nicholas Anderson
相关产品推荐
相关产品推荐

