[R] math symbol + value of a variable in legend.

William Dunlap wdunlap at tibco.com
Thu Aug 27 20:18:11 CEST 2009


> -----Original Message-----
> From: r-help-bounces at r-project.org 
> [mailto:r-help-bounces at r-project.org] On Behalf Of Martin Maechler
> Sent: Thursday, August 27, 2009 1:30 AM
> To: Kenneth Roy Cabrera Torres
> Cc: RHelp
> Subject: Re: [R] math symbol + value of a variable in legend.
> 
> >>>>> "KRCT" == Kenneth Roy Cabrera Torres <krcabrer at une.net.co>
> >>>>>     on Tue, 25 Aug 2009 17:26:04 -0500 writes:
> 
>     KRCT> Thank you very much for your help.
> 
>     KRCT> To the R gurus: It will be better at the future to 
> simplify this
>     KRCT> options.
> 
>     KRCT> They are too cumbersome!!!
> 
> The ones  David showed, yes, are too cumbersome.
> 
> There's a variant, which is even a bit more elegant,
> but really a small (?) change in R's handling of "symbols" could
> make it even more elegant.
> I'll talk about that on the dedicated list, R-devel.
> 
> Here's the slightly more elegant code (for current versions of R):
> 
> plot(1:5,1:5,type="n")
> legend("topleft", legend=
>        c(as.expression( bquote(mu == .(m1)) ),
>          as.expression( bquote(mu == .(m2)) )), lty = 1:2)

Another version that is more easily extendable to longer legends is

   legend("topright", lty=1:2, legend=
      as.expression(lapply(c(m1,m2), function(m)bquote(mu==.(m)))))

Another example is:
   m <- c(1,exp(1),pi)
   plot(m, pch=seq_along(m), xlab=expression(iota), ylab=quote(e^c(0,1,log(pi))))
   legend("bottom", pch=seq_along(m), legend=as.expression(lapply(seq_along(m),function(i)bquote(m[.(i)]==.(m[i])))))

Note that xlab and ylab can be either expressions or calls
(or, in general, language objects) but legend must be an expression for
this to work.

If legend is a list of calls, as in the more direct
  legend("bottomright", pch=seq_along(m), legend=lapply(seq_along(m),function(i)bquote(m[.(i)]==.(m[i]))))
then it looks like its elements are coerced to character strings (via deparse).
If legend's legend= argument would interpret lists differently than it does,
treating elements which are expressions or calls as plotmath requests
and other types as things to convert to strings, then I think the syntax
would be simpler.  E.g., your example could be
   legend("bottomleft", legend=list(bquote(mu==.(m1)), bquote(mu=.(m2))), lty=1:2)
You would not have to throw in the extraneous as.expression calls nor
have to redefine the c function.

Bill Dunlap
TIBCO Software Inc - Spotfire Division
wdunlap tibco.com 
 
> ##
> ## or with subscripts :
> ##
> legend("top", legend =
>        c(as.expression( bquote(mu[1] == .(m1)) ),
>          as.expression( bquote(mu[2] == .(m2)) )), lty = 1:2)
> ##
> ## or, if you really need to have the subscript as a 
> *variable* as well:
> ##
> i1 <- 11; i2 <- 20
> legend("topright", legend =
>        c(as.expression( bquote(mu[.(i1)] == .(m1)) ),
>          as.expression( bquote(mu[.(i2)] == .(m2)) )), lty = 1:2)
> 
> 
> Martin Maechler, ETH Zurich
> 
> 
>     KRCT> El mar, 25-08-2009 a las 18:16 -0400, David 
> Winsemius escribió:
>     >> On Aug 25, 2009, at 5:51 PM, David Winsemius wrote:
>     >> 
>     >> >
>     >> > On Aug 25, 2009, at 4:30 PM, Kenneth Roy Cabrera 
> Torres wrote:
>     >> >
>     >> >> Hi R users:
>     >> >>
>     >> >> I will like to have a legend with math symbols and also with
>     >> >> the value of a variable.
>     >> >>
>     >> >> But I cannot obtain both at the same time (symbol + 
> value of a
>     >> >> variable):
>     >> >>
>     >> >> Here is a reproducible example:
>     >> >>
>     >> >> m1<-5
>     >> >> m2<-12
>     >> >
>     >> > I think I am violating a fortune but this "worked":
>     >> >
>     >> > plot(1:5,1:5,type="n")
>     >> > legend
>     >> > ("topleft",legend=c(eval(substitute( 
> expression(paste(mu,"=",m1)),  
>     >> > list(m1=m1) )) , eval(substitute( 
> expression(paste(mu,"=",m2)),  
>     >> > list(m2=m2) ) )), lty=1:2)
>     >> >
>     >> > And efforts at simplification were at least partly 
> successful:
>     >> >
>     >> > legend("topleft",legend=c(eval(substitute( 
> expression(mu == m1),  
>     >> > list(m1=m1) )) ,
>     >> >                          eval(substitute( 
> expression(mu == m2),  
>     >> > list(m2=m2) ) )),
>     >> >                  lty=1:2)
>     >> 
>     >> And this adds subscripts to the mu's:
>     >> 
>     >> plot(1:5,1:5,type="n");
>     >> legend("topleft",
>     >> legend=c( eval(substitute( expression(mu[i] == m1),  
>     >> list(i=1, m1=m1) )) ,
>     >> eval(substitute( expression(mu[i] == m2),  
>     >> list(i=2, m2=m2) ))  ),
>     >> lty=1:2)
>     >> 
>     >> 
>     >> >
>     >> >
>     >> >> plot(1:5,1:5,type="n")
>     >> >> legend 
>     >> >> ("topleft 
>     >> >> ",legend 
>     >> >> = 
>     >> >> 
> c(paste(expression(mu),"=",m1),expression(paste(mu,"=",m2))),lty=1:2)
>     >> >>
>     >> >> Thank you for your help.
>     >> >>
>     >> >> Kenneth
>     >> > -- 
>     >> 
>     >> David Winsemius, MD
>     >> Heritage Laboratories
>     >> West Hartford, CT
>     >> 
> 
>     KRCT> ______________________________________________
>     KRCT> R-help at r-project.org mailing list
>     KRCT> https://stat.ethz.ch/mailman/listinfo/r-help
>     KRCT> PLEASE do read the posting guide 
> http://www.R-project.org/posting-guide.html
>     KRCT> and provide commented, minimal, self-contained, 
> reproducible code.
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide 
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
> 




More information about the R-help mailing list