0

We often want individual regression equations in ggplot facets. The best way to do this is build the labels in a dataframe and then add them manually. But what if the labels contain plotmath, e.g., superscripts?

Simon Woodward
  • 1,946
  • 1
  • 16
  • 24

1 Answers1

0

Here is a way to do it. The plotmath is converted to a string and then parsed by ggplot. The test_eqn function is taken from another Stackoverflow post, I'll link it when I find it again. Sorry about that.

library(ggplot2)
library(dplyr)

test_eqn <- function(y, x){
  m <- lm(log(y) ~ log(x)) # fit y = a * x ^ b in log space
  p <- exp(predict(m)) # model prediction of y
  eq <- substitute(expression(Y==a~X^~b),
                   list(
                     a = format(unname(exp(coef(m)[1])), digits = 3),
                     b = format(unname(coef(m)[2]), digits = 3)
                  ))
  list(eq = as.character(eq)[2], pred = p)
}

set.seed(123)
x <-  runif(20)
y <-  runif(20)
test_eqn(x,y)$eq
#> [1] "Y == \"0.57\" ~ X^~\"0.413\""

data <- data.frame(x = x,
                   y = y,
                   f = sample(c("A","B"), 20, replace = TRUE)) %>%
  group_by(f) %>%
  mutate(
    label = test_eqn(y,x)$eq, # add label
    labelx = mean(x),
    labely = mean(y),
    pred = test_eqn(y,x)$pred # add prediction
  )

# plot fits (use slice(1) to avoid multiple copies of labels)
ggplot(data) +
  geom_point(aes(x = x, y = y)) +
  geom_line(aes(x = x, y = pred), colour = "red") +
  geom_text(data = slice(data, 1), aes(x = labelx, y = labely, label = label), parse = TRUE) +
  facet_wrap("f")

Created on 2021-10-20 by the reprex package (v2.0.1)

Simon Woodward
  • 1,946
  • 1
  • 16
  • 24