Причина этого в том, что вы сначала format()
свои данные в символьном формате, а затем пытаетесь вычислить с помощью строк.Вы можете решить проблему следующим образом:
Во-первых, удобнее преобразовать ваш список в data.frame
, используя:
d <- as.data.frame(l)
Значения должны быть преобразованы обратно в числовые значения,так как вы все еще хотите сделать арифметику внутри формулы:
d[] <- lapply(d, function(x) as.numeric(as.character(x)))
Тогда она должна работать нормально:
eq <- substitute(italic(Sepal.Length) == a - b %*% italic(Petal.Length)~","~italic(R)^2~"="~r2~",
"~italic(P)~"="~p, d)
p + geom_text(aes(x =5, y = 0, label = as.character(as.expression(eq))), parse = TRUE)
Вы также можете использовать annotate()
, чтобы добавить формулу к графику,что может выглядеть немного лучше:
p + annotate('text', 7, 4,
label=paste("italic(Sepal.Length)==", d$a, "~-~", d$b, "~x~",
"~italic(Petal.Length)~';'~italic(r)^2==", d$r2,
"~italic(P)==", d$p),
parse=TRUE,
hjust=1, size=3.5)
Выход:
Данные:
library(ggplot2)
p <- ggplot(data=iris, aes(x=Petal.Length, y=Sepal.Length)) +
geom_point(color="blue", stat="identity") +
geom_smooth(method="lm", se=FALSE, color="red", formula=y~x)
model.lm <- lm(Sepal.Length ~ Petal.Length, data=iris)
l <- list(a=format(coef(model.lm)[1], digits=4),
b=format(coef(model.lm)[2], digits=4),
r2=format(summary(model.lm)$r.squared, digits=4),
p=format(summary(model.lm)$coefficients[2, 4], digits=4))