Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Line break in ggplot annotate with LateX expression

SITUATION:

I have a ggplot diagram, where I want to add some text annotation. The text annotation should appear in two lines (for readibility and space), and each line includes some TeX formula:

library(tidyverse)
library(latex2exp)

ggplot(NULL, aes(c(-5,5))) +
      geom_area(stat = "function", fun = dnorm, fill = "grey40", xlim = c(-2, 2)) +
      annotate(geom = "text", label = TeX(paste("Distribution of $\\bar{x}$","\n","under $H_0$")),
               x = -1, y = 0.3,
               color = "red")

PROBLEM:

The line break does not show up. The line is not split in two lines.

WHAT DID NOT WORK:

I have tried paste(TeX(...)), and parse = T, without success.

enter image description here

I also tried this label = expression(paste("distribution of ", bar(x), "\n", "under H0")) looked up here, no success.

QUESTION:

How can I split the annotation (red color text) in two lines?

like image 307
Sebastian Sauer Avatar asked Nov 29 '17 15:11

Sebastian Sauer


1 Answers

You could use atop and plotmath expressions instead (see ?plotmath for additional info):

ggplot(NULL, aes(c(-5,5))) +
  geom_area(stat = "function", fun = dnorm, fill = "grey70", xlim = c(-2, 2)) +
  annotate(geom = "text", label = expression(atop("Distribution of"~bar(x), "under"~H[0])),
           x = -1, y = 0.3,
           color = "red") +
  theme_classic()

I've changed the theme and colors for this example so that the text will stand out.

enter image description here

UPDATE: Regarding the comment, here's one option, though you'll need to play around with the vertical spacing. We first construct exp, a list of plotmath expressions. Then, in annotate, we need y to be a vector of values equal in length to the number of elements in exp. parse=TRUE tells ggplot to treat the elements of exp as plotmath expressions and parse them:

exp = list("Distribution of"~bar(x),
           "under"~H[0],
           hat(mu)~"is the mean")

ggplot(NULL, aes(c(-5,5))) +
  geom_area(stat = "function", fun = dnorm, fill = "grey70", xlim = c(-2, 2)) +
  annotate(geom = "text", label = exp,
           x = -1, y = seq(0.32,0.28,length=3),
           size=3, color = "red", parse=TRUE) +
  theme_classic()

enter image description here

like image 130
eipi10 Avatar answered Nov 01 '22 20:11

eipi10