2014-11-24 154 views
1

前一段时间,我看到Jayden从一个关于将回归方程加入到一个图中的答案,我发现这非常有用。但我不想显示R^2,所以我改变了代码了一下这个:ggplot in R:在图中加入回归方程

lm_eqn = function(m) { 
l <- list(a = format(coef(m)[1], digits = 2), 
    b = format(abs(coef(m)[2]), digits = 2)); 
if (coef(m)[2] >= 0) { 
eq <- substitute(italic(y) == a + b %.% italic(x)) 
} else { 
eq <- substitute(italic(y) == a - b %.% italic(x))  
} 
as.character(as.expression(eq));     
} 

这成功地绘制“A + BX”或“A-BX”的情节,但没有取代a和b的实际系数。有谁知道如何解决这个问题?非常感谢!

杰登的回答是:

lm_eqn = function(m) { 
l <- list(a = format(coef(m)[1], digits = 2), 
    b = format(abs(coef(m)[2]), digits = 2), 
    r2 = format(summary(m)$r.squared, digits = 3)); 
if (coef(m)[2] >= 0) { 
eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2,l) 
} else { 
eq <- substitute(italic(y) == a - b %.% italic(x)*","~~italic(r)^2~"="~r2,l)  
} 
as.character(as.expression(eq));     
} 

回答

2

它看起来像你缺少在substitute()l。也就是说,使用substitute(yourFormula, l)。这里是一个没有r^2的MWE,与你正在查看的那个相似(我认为它在Adding Regression Line Equation and R2 on graph)。

library(ggplot2) 

# Function to generate correlated data. 
GenCorrData = function(mu, Sig, n = 1000) { 
    U   <- chol(Sig) 
    Z   <- matrix(rnorm(n*length(mu)), nrow = length(mu)) 
    Y   <- crossprod(U,Z) + mu 
    Y   <- as.data.frame(t(Y)) 
    names(Y)  <- c("x", "y") 
    return(Y) 
} 

# Function to add text 
LinEqn = function(m) { 
    l <- list(a = format(coef(m)[1], digits = 2), 
      b = format(abs(coef(m)[2]), digits = 2)); 
    if (coef(m)[2] >= 0) { 
    eq <- substitute(italic(y) == a + b %.% italic(x),l) 
    } else { 
    eq <- substitute(italic(y) == a - b %.% italic(x),l)  
    } 
    as.character(as.expression(eq));     
} 

# Example 
set.seed(700) 
n1    <- 1000 
mu1   <- c(4, 5) 
Sig1   <- matrix(c(1, .8, .8, 1), nrow = length(mu1)) 
df1   <- GenCorrData(mu1, Sig1, n1) 
scatter1  <- ggplot(data = df1, aes(x, y)) + 
        geom_point(shape = 21, color = "blue", size = 3.5) + 
        scale_x_continuous(expand = c(0, 0), limits = c(0, 8)) + 
        scale_y_continuous(expand = c(0, 0), limits = c(0, 8)) 
scatter.line1 <- scatter1 + 
        geom_smooth(method = "lm", formula = y ~ x, se = FALSE, 
           color="black", size = 1) + 
        annotate("text", x = 2, y = 7, color = "black", size = 5, 
          label = LinEqn(lm(y ~ x, df1)), parse = TRUE) 
scatter.line1 

Regression equation

+0

感谢。我添加了1,但后来得到如下错误信息:错误代替(italic(y)== a - b%。%italic(x),1): 指定了无效的环境。我怎样才能解决这个问题? – Bearbear 2014-11-24 19:55:54

+0

@Bearbear,'substitute()'正在寻找列表的名字作为它的第二个参数。你不是把它称为“l”而不是“1”? – 2014-11-24 21:10:08

+0

W,我写了“l”作为数字“1”,我犯了一个错误。现在它可以工作,非常感谢你。 – Bearbear 2014-11-24 21:58:38