Rev 7745 | Blame | Last modification | View Log | Download | RSS feed
\name{plotmath}\alias{plotmath}\title{Mathematical Annotation in R}\description{If the \code{text} argument to one of the text-drawing functions(\code{\link{text}}, \code{\link{mtext}}, \code{\link{axis}}) in \Ris an expression, the argument is interpreted as a mathematicalexpression and the output will be formatted according to TeX-likerules.}\details{A mathematical expression must obey the normal rules of syntax for any\R expression, but it is interpreted according to very different rulesthan for normal \R expressions.It is possible to produce many different mathematical symbols, generatesub- or superscripts, produce fractions, etc.The output from \code{example(plotmath)} includes several tables whichshow the available features. In these tables, the columns of grey textshow sample \R expressions, and the columns of black text show theresulting output.}\references{Murrell, P. and Ihaka, R. \emph{An approach to providingmathematical annotation in plots}, Journal of Computational and GraphicalStatistics (In Press).}\seealso{\code{\link{axis}},\code{\link{mtext}},\code{\link{text}},\code{\link{title}}}\examples{x <- seq(-4, 4, len = 101)y <- cbind(sin(x), cos(x))matplot(x, y, type = "l", xaxt = "n",main = expression(paste(plain(sin) * phi, " and ",plain(cos) * phi)),ylab = expression("sin" * phi, "cos" * phi), # only 1st is takenxlab = expression(paste("Phase Angle ", phi)),col.main = "blue")axis(1, at = c(-pi, -pi/2, 0, pi/2, pi),lab = expression(-pi, -pi/2, 0, pi/2, pi))plot(1:10, 1:10)text(4, 9, expression(hat(beta) == (X^t * X)^{-1} * X^t * y))text(4, 8.4, "expression(hat(beta) == (X^t * X)^{-1} * X^t * y)",cex = .8)text(4, 7, expression(bar(x) == sum(frac(x[i], n), i==1, n)))text(4, 6.4, "expression(bar(x) == sum(frac(x[i], n), i==1, n))",cex = .8)text(8, 5, expression(paste(frac(1, sigma*sqrt(2*pi)), " ",plain(e)^{frac(-(x-mu)^2, 2*sigma^2)})),cex= 1.2)####### create tables of mathematical annotation functionality######make.table <- function(nr, nc) {savepar <- par(mar=rep(0, 4), pty="s")plot(c(0, nc*2 + 1), c(0, -(nr + 1)),type="n", xlab="", ylab="", axes=F)savepar}get.r <- function(i, nr) {i \%\% nr + 1}get.c <- function(i, nr) {i \%/\% nr + 1}draw.title.cell <- function(title, i, nr) {r <- get.r(i, nr)c <- get.c(i, nr)text(2*c - .5, -r, title)rect((2*(c - 1) + .5), -(r - .5), (2*c + .5), -(r + .5))}draw.plotmath.cell <- function(expr, i, nr, string = NULL) {r <- get.r(i, nr)c <- get.c(i, nr)if (is.null(string)) {string <- deparse(expr)string <- substr(string, 12, nchar(string) - 1)}text((2*(c - 1) + 1), -r, string, col="grey")text((2*c), -r, expr, adj=c(.5,.5))rect((2*(c - 1) + .5), -(r - .5), (2*c + .5), -(r + .5), border="grey")}nr <- 20nc <- 2oldpar <- make.table(nr, nc)i <- 0draw.title.cell("Arithmetic Operators", i, nr); i <- i + 1draw.plotmath.cell(expression(x + y), i, nr); i <- i + 1draw.plotmath.cell(expression(x - y), i, nr); i <- i + 1draw.plotmath.cell(expression(x * y), i, nr); i <- i + 1draw.plotmath.cell(expression(x / y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%+-\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%/\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%*\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(-x), i, nr); i <- i + 1draw.plotmath.cell(expression(+x), i, nr); i <- i + 1draw.title.cell("Sub/Superscripts", i, nr); i <- i + 1draw.plotmath.cell(expression(x[i]), i, nr); i <- i + 1draw.plotmath.cell(expression(x^2), i, nr); i <- i + 1draw.title.cell("Juxtaposition", i, nr); i <- i + 1draw.plotmath.cell(expression(x * y), i, nr); i <- i + 1draw.plotmath.cell(expression(paste(x, y, z)), i, nr); i <- i + 1draw.title.cell("Lists", i, nr); i <- i + 1draw.plotmath.cell(expression(list(x, y, z)), i, nr); i <- i + 1# even columns upi <- 20draw.title.cell("Radicals", i, nr); i <- i + 1draw.plotmath.cell(expression(sqrt(x)), i, nr); i <- i + 1draw.plotmath.cell(expression(sqrt(x, y)), i, nr); i <- i + 1draw.title.cell("Relations", i, nr); i <- i + 1draw.plotmath.cell(expression(x == y), i, nr); i <- i + 1draw.plotmath.cell(expression(x != y), i, nr); i <- i + 1draw.plotmath.cell(expression(x < y), i, nr); i <- i + 1draw.plotmath.cell(expression(x <= y), i, nr); i <- i + 1draw.plotmath.cell(expression(x > y), i, nr); i <- i + 1draw.plotmath.cell(expression(x >= y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%~~\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%=~\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%==\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%prop\% y), i, nr); i <- i + 1draw.title.cell("Typeface", i, nr); i <- i + 1draw.plotmath.cell(expression(plain(x)), i, nr); i <- i + 1draw.plotmath.cell(expression(italic(x)), i, nr); i <- i + 1draw.plotmath.cell(expression(bold(x)), i, nr); i <- i + 1draw.plotmath.cell(expression(bolditalic(x)), i, nr); i <- i + 1# Need fewer, wider columns for ellipsis ...nr <- 20nc <- 2make.table(nr, nc)i <- 0draw.title.cell("Ellipsis", i, nr); i <- i + 1draw.plotmath.cell(expression(list(x[1], ..., x[n])), i, nr); i <- i + 1draw.plotmath.cell(expression(x[1] + ... + x[n]), i, nr); i <- i + 1draw.plotmath.cell(expression(list(x[1], cdots, x[n])), i, nr); i <- i + 1draw.plotmath.cell(expression(x[1] + ldots + x[n]), i, nr); i <- i + 1draw.title.cell("Set Relations", i, nr); i <- i + 1draw.plotmath.cell(expression(x \%subset\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%subseteq\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%supset\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%supseteq\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%notsubset\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%in\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%notin\% y), i, nr); i <- i + 1draw.title.cell("Accents", i, nr); i <- i + 1draw.plotmath.cell(expression(hat(x)), i, nr); i <- i + 1draw.plotmath.cell(expression(tilde(x)), i, nr); i <- i + 1draw.plotmath.cell(expression(ring(x)), i, nr); i <- i + 1draw.plotmath.cell(expression(bar(xy)), i, nr); i <- i + 1draw.plotmath.cell(expression(widehat(xy)), i, nr); i <- i + 1draw.plotmath.cell(expression(widetilde(xy)), i, nr); i <- i + 1draw.title.cell("Arrows", i, nr); i <- i + 1draw.plotmath.cell(expression(x \%<->\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%->\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%<-\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%up\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%down\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%<=>\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%=>\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%<=\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%dblup\% y), i, nr); i <- i + 1draw.plotmath.cell(expression(x \%dbldown\% y), i, nr); i <- i + 1draw.title.cell("Symbolic Names", i, nr); i <- i + 1draw.plotmath.cell(expression(Alpha - Omega), i, nr); i <- i + 1draw.plotmath.cell(expression(alpha - omega), i, nr); i <- i + 1draw.plotmath.cell(expression(infinity), i, nr); i <- i + 1draw.plotmath.cell(expression(32 * degree), i, nr); i <- i + 1draw.plotmath.cell(expression(60 * minute), i, nr); i <- i + 1draw.plotmath.cell(expression(30 * second), i, nr); i <- i + 1# Need even fewer, wider columns for typeface and style ...nr <- 20nc <- 1make.table(nr, nc)i <- 0draw.title.cell("Style", i, nr); i <- i + 1draw.plotmath.cell(expression(displaystyle(x)), i, nr); i <- i + 1draw.plotmath.cell(expression(textstyle(x)), i, nr); i <- i + 1draw.plotmath.cell(expression(scriptstyle(x)), i, nr); i <- i + 1draw.plotmath.cell(expression(scriptscriptstyle(x)), i, nr); i <- i + 1draw.title.cell("Spacing", i, nr); i <- i + 1draw.plotmath.cell(expression(x ~~ y), i, nr); i <- i + 1# Need fewer, taller rows for fractions ...# cheat a bit to save pagespar(new =T)nr <- 10nc <- 1make.table(nr, nc)i <- 4draw.plotmath.cell(expression(x + phantom(0) + y), i, nr); i <- i + 1draw.plotmath.cell(expression(x + over(1, phantom(0))), i, nr); i <- i + 1draw.title.cell("Fractions", i, nr); i <- i + 1draw.plotmath.cell(expression(frac(x, y)), i, nr); i <- i + 1draw.plotmath.cell(expression(over(x, y)), i, nr); i <- i + 1draw.plotmath.cell(expression(atop(x, y)), i, nr); i <- i + 1# Need fewer, taller rows and fewer, wider columns for big operators ...nr <- 10nc <- 1make.table(nr, nc)i <- 0draw.title.cell("Big Operators", i, nr); i <- i + 1draw.plotmath.cell(expression(sum(x[i], i=1, n)), i, nr); i <- i + 1draw.plotmath.cell(expression(prod(plain(P)(X == x), x)), i, nr); i <- i + 1draw.plotmath.cell(expression(integral(f(x) * dx, a, b)), i, nr); i <- i + 1draw.plotmath.cell(expression(union(A[i], i==1, n)), i, nr); i <- i + 1draw.plotmath.cell(expression(intersect(A[i], i==1, n)), i, nr); i <- i + 1draw.plotmath.cell(expression(lim(f(x), x \%->\% 0)), i, nr); i <- i + 1draw.plotmath.cell(expression(min(g(x), x >= 0)), i, nr); i <- i + 1draw.plotmath.cell(expression(inf(S)), i, nr); i <- i + 1draw.plotmath.cell(expression(sup(S)), i, nr); i <- i + 1make.table(nr, nc)i <- 0draw.title.cell("Grouping", i, nr); i <- i + 1draw.plotmath.cell(expression((x + y)*z), i, nr); i <- i + 1draw.plotmath.cell(expression(x^y + z), i, nr); i <- i + 1draw.plotmath.cell(expression(x^(y + z)), i, nr); i <- i + 1# have to do this one by handdraw.plotmath.cell(expression(x^{y + z}), i, nr, string="x^{y + z}"); i <- i + 1draw.plotmath.cell(expression(group("(", list(a, b), "]")), i, nr); i <- i + 1draw.plotmath.cell(expression(bgroup("(", atop(x, y), ")")), i, nr); i <- i + 1draw.plotmath.cell(expression(group(lceil, x, rceil)), i, nr); i <- i + 1draw.plotmath.cell(expression(group(lfloor, x, rfloor)), i, nr); i <- i + 1draw.plotmath.cell(expression(group("|", x, "|")), i, nr); i <- i + 1par(oldpar)}\keyword{aplot}