Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

multiple bquote items in legend of an R plot

Following works, (copy & paste into R)

a=123
plot(1,1)
legend('bottomleft',legend=bquote(theta == .(a)))

I want to have multiple items in the legend. All with greek letters. As a simple example, if I repeat the item twice the code does not work anymore

a=123
plot(1,1)
legend('bottomleft',legend=c(bquote(theta == .(a)),bquote(theta == .(a))))

I have tried many more complicated expressions but they all did not work.

Any help will be appreciated.

like image 791
Sang Avatar asked Aug 26 '11 20:08

Sang


2 Answers

In this case, plotmath is not able to coerce the list of calls to expressions.

> cs <- c(bquote(theta == .(a)),bquote(theta == .(a)))
> cs
[[1]]
theta == 123

[[2]]
theta == 123

> sapply(cs, class)
[1] "call" "call"

You can make this work if you coerce to expressions yourself:

> c(as.expression(bquote(theta == .(a))), as.expression(bquote(theta == .(a))))
expression(theta == 123, theta == 123)
> plot(1,1)
> legend('bottomleft',legend= c(as.expression(bquote(theta == .(a))), 
+                               as.expression(bquote(theta == .(a)))))

Another way is to coerce the original list of calls to expressions using sapply:

plot(1,1)
legend("bottomleft", 
       sapply(c(bquote(theta == .(a)), bquote(theta == .(a))), as.expression))
like image 162
Gavin Simpson Avatar answered Oct 16 '22 15:10

Gavin Simpson


To coerce the original list of calls to expressions it is not necessary to use sapply(). It suffices to use as.expression() only for one of the components within the c() construct:

plot(1,1)
legend("bottomleft", 
       c(as.expression(bquote(theta == .(a))), bquote(theta == .(a))))

c() will then automatically coerce the whole list, to the expression class.

like image 26
vladbazon Avatar answered Oct 16 '22 15:10

vladbazon