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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:37:00