Как отформатировать ggplot `geom_text` с формулой, получив нежелательный" c (...) " - PullRequest
0 голосов
/ 16 декабря 2018

В моем коде ниже я хочу показать формулу для , подходящей для моего графика с geom_text, но я получаю нежелательные c дозначения a и b, как мне это предотвратить?

enter image description here

p <- ggplot(data=Algae, aes(x=a254, y=DOC))+
      geom_point(color="blue",stat="identity") +
      geom_smooth(method="lm",se=FALSE,color="red",formula=y~x)

model.lm <- lm(DOC~a254, data=Algae)

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))

eq <- substitute(italic(DOC) == a - b %*% italic(a254)~","~italic(R)^2~"="~r2~",
                 "~italic(P)~"="~p, l)
p1 <- p + geom_text(aes(x =6, y = 0, label = as.character(as.expression(eq))), parse = TRUE)
p1

1 Ответ

0 голосов
/ 16 декабря 2018

Причина этого в том, что вы сначала 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)

Выход:

enter image description here


Данные:

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))
...