It is quite common to want to use mathematical expressions in R. Specifically, mathematical symbols or entire equations may be needed when building plots.
In this tutorial, we will examine how mathematical expressions can be included into R graphics.
We will use the co2 data already found in R. The data includes the atmospheric concentrations of CO2 in parts per million. The data was recorded monthly at the Mauna Loa Observatory in Hawaii between 1959 and 1997.
The following code loads the data and then creates a simple plot of CO2 versus time.
data("co2") plot(co2)

This is a bit ugly and there is room to clean up the plot.
We can use expression()
to include mathematical expressions in the plot labels.
plot(co2,ylab = expression("Atmospheric concentration of CO"[2]),las=1)

We now see that CO2 on the Y-label has a subscript for the number 2. We can include more advanced mathematical expressions as well. For example, let’s add a title to the plot.
plot(co2,ylab = expression("Atmospheric concentration of CO"[2]), main = expression(paste("CO"[2]," measured in ",frac('parts','million'),sep='')),las=1)

- Work extensively with mathematical simulations,
- Learn the background math of these simulations and how mathematical expressions can simplify your work,
- And much more
Notice that here we used expression()
in combination with paste()
to combine multiple pieces of information.
If you want to include a variable within a mathematical expression, you need to use substitute()
instead of expression()
.
plot(co2,ylab = expression("Atmospheric concentration of CO"[2]), main = expression(paste("CO"[2]," measured in ",frac('parts','million'),sep='')),las=1) text(1994,y = 340,labels = substitute(paste("CO"[2],'=',CO2_level,sep=''),list(CO2_level=364))) arrows(1994,342,1998,364.34,length = 0.2,col='red')

The plot shows how text()
can be used with substitute()
to insert mathematical notation with a variable CO2_level
that can be altered or updated.
As you can imagine, there are lots of possible mathematical expressions, depending on the specific context. You can use ?plotmath
or demo(plotmath)
to explore more options.
Here are some possibilities which can be found by using ?plotmath
.
Syntax | Meaning |
x + y |
x plus y |
x - y |
x minus y |
x*y |
juxtapose x and y |
x/y |
x forwardslash y |
x %+-% y |
x plus or minus y |
x %/% y |
x divided by y |
x %*% y |
x times y |
x %.% y |
x cdot y |
x[i] |
x subscript i |
x^2 |
x superscript 2 |
paste(x, y, z) |
juxtapose x, y, and z |
sqrt(x) |
square root of x |
sqrt(x, y) |
yth root of x |
x == y |
x equals y |
x != y |
x is not equal to y |
x < y |
x is less than y |
x <= y |
x is less than or equal to y |
x > y |
x is greater than y |
x >= y |
x is greater than or equal to y |
x %~~% y |
x is approximately equal to y |
x %=~% y |
x and y are congruent |
x %==% y |
x is defined as y |
x %prop% y |
x is proportional to y |
plain(x) |
draw x in normal font |
bold(x) |
draw x in bold font |
italic(x) |
draw x in italic font |
bolditalic(x) |
draw x in bolditalic font |
list(x, y, z) |
comma-separated list |
... |
ellipsis (height varies) |
cdots |
ellipsis (vertically centred) |
ldots |
ellipsis (at baseline) |
x %subset% y |
x is a proper subset of y |
x %subseteq% y |
x is a subset of y |
x %notsubset% y |
x is not a subset of y |
x %supset% y |
x is a proper superset of y |
x %supseteq% y |
x is a superset of y |
x %in% y |
x is an element of y |
x %notin% y |
x is not an element of y |
hat(x) |
x with a circumflex |
tilde(x) |
x with a tilde |
dot(x) |
x with a dot |
ring(x) |
x with a ring |
bar(xy) |
xy with bar |
widehat(xy) |
xy with a wide circumflex |
widetilde(xy) |
xy with a wide tilde |
x %<->% y |
x double-arrow y |
x %->% y |
x right-arrow y |
x %<-% y |
x left-arrow y |
x %up% y |
x up-arrow y |
x %down% y |
x down-arrow y |
x %<=>% y |
x is equivalent to y |
x %=>% y |
x implies y |
x %<=% y |
y implies x |
x %dblup% y |
x double-up-arrow y |
x %dbldown% y |
x double-down-arrow y |
alpha – omega |
Greek symbols |
Alpha – Omega |
uppercase Greek symbols |
theta1, phi1, sigma1, omega1 |
cursive Greek symbols |
Upsilon1 |
capital upsilon with hook |
infinity |
infinity symbol |
partialdiff |
partial differential symbol |
32*degree |
32 degrees |
60*minute |
60 minutes of angle |
30*second |
30 seconds of angle |
displaystyle(x) |
draw x in normal size (extra spacing) |
textstyle(x) |
draw x in normal size |
scriptstyle(x) |
draw x in small size |
scriptscriptstyle(x) |
draw x in very small size |
underline(x) |
draw x underlined |
x ~~ y |
put extra space between x and y |
x + phantom(0) + y |
leave gap for “0”, but don’t draw it |
x + over(1, phantom(0)) |
leave vertical gap for “0” (don’t draw) |
frac(x, y) |
x over y |
over(x, y) |
x over y |
atop(x, y) |
x over y (no horizontal bar) |
sum(x[i], i==1, n) |
sum x[i] for i equals 1 to n |
prod(plain(P)(X==x), x) |
product of P(X=x) for all values of x |
integral(f(x)*dx, a, b) |
definite integral of f(x) wrt x |
union(A[i], i==1, n) |
union of A[i] for i equals 1 to n |
intersect(A[i], i==1, n) |
intersection of A[i] |
lim(f(x), x %->% 0) |
limit of f(x) as x tends to 0 |
min(g(x), x > 0) |
minimum of g(x) for x greater than 0 |
inf(S) |
infimum of S |
sup(S) |
supremum of S |
x^y + z |
normal operator precedence |
x^(y + z) |
visible grouping of operands |
x^{y + z} |
invisible grouping of operands |
group("(",list(a, b),"]") |
specify left and right delimiters |
bgroup("(",atop(x,y),")") |
use scalable delimiters |
group(lceil, x, rceil) |
special delimiters |
Your plots here are no longer rendering on either safari or chrome.