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

William Dunlap wdunlap at tibco.com
Thu Aug 27 21:27:08 CEST 2009



Bill Dunlap
TIBCO Software Inc - Spotfire Division
wdunlap tibco.com  

> -----Original Message-----
> From: r-help-bounces at r-project.org 
> [mailto:r-help-bounces at r-project.org] On Behalf Of William Dunlap
> Sent: Thursday, August 27, 2009 11:18 AM
> To: Martin Maechler; Kenneth Roy Cabrera Torres
> Cc: RHelp
> Subject: Re: [R] math symbol + value of a variable in legend.
> 
> 
> > -----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.

To try this out, redefine as.graphicsAnnot to process lists
specially, before the existing check for is.language(x)||!is.object(x):

as.graphicsAnnot <- 
function (x) 
if (is.list(x)) {
  as.expression(lapply(x, function(xi) {
    if(is.expression(xi)) xi[[1]]
    else if (is.language(xi)) xi
    else as.character(xi)
  })) 
} else if (is.language(x) || !is.object(x)) {
  x 
} else {
  as.character(x)
}

> 
> 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.
> > 
> 
> ______________________________________________
> 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