How to put plotmath labels in ggplot facets

84 Views Asked by At

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?

1

There are 1 best solutions below

0
Simon Woodward On

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)