[R] xy.coords in text

Greg Snow Greg.Snow at imail.org
Thu Oct 23 20:37:05 CEST 2008


The xy.coords function is a powerful function used by a lot of the plotting functions because it allows the user to enter x and y coordinates as 2 vectors, a 2 column matrix, or a list with x and y components (and possibly others), but it does not do 'topleft' and the like.  The legend function (and some others) have special handling to recognize and implement strings like 'topleft'.  One of the easier ways to plot something in the top left (or other relative positions) is to include the following line in your panel function:

usr <- par('usr')

Now the vector user will have 4 values: xleft, xright, ybottom, ytop.  To place text in the topleft corner, just do:

text(usr[1], usr[4], 'your text here', adj=c(0,1) )

or something like:

text( usr[1] + (usr[2]-usr[1])/10, usr[4] - (usr[4]-usr[3])/10, 'your text' )

to center the text 10% of the way in from the topleft corner.  The other corners and sides should be fairly easy to work out from the above.

Other options include using the grconvertX and grconvertY functions.

Hope this helps,

--
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.snow at imail.org
801.408.8111


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of Xavier Robin
> Sent: Thursday, October 23, 2008 5:58 AM
> To: r-help at r-project.org
> Subject: [R] xy.coords in text
>
> Hello,
>
> I want to add text annotation about correlation on "pairs" plots. I
> found that I could pass a function to the "panel" argument of pairs :
>
>   panel.annot <- function(x, y, ...) {
>     points(x, y, ...)
>     c <- cor.test(x, y)
>     legend("topleft", legend=substitute(rho == r,
> list(r=sprintf("%.2f",
> c$estimate))), bty="n")
>   }
>
> And then :
>
>   dat <- data.frame(a=rnorm(100), b=runif(100), c=runif(100)) # just
> random data
>   pairs(dat, panel=panel.annot)
>
> It works fine. But what I plot is not really a legend, so I'd prefer to
> use the text function instead of legend :
>
>   panel.annot <- function(x, y, ...) {
>     points(x, y, ...)
>     c <- cor.test(x, y)
>     text("topleft", labels=substitute(rho == r, list(r=sprintf("%.2f",
> c$estimate))))
>   }
>
> But the text is not plotted and I get warnings instead :
>
>   1: In xy.coords(x, y, recycle = TRUE) :
>     NAs introduced by coercion
>
> If I run xy.coords("topleft") directly, I can see that the y coord (and
> ylab as well) is not defined, but I don't understand why it would work
> with legend and not with text... Especially since ?text doc states that
>
> > 'y' may be missing since 'xy.coords(x,y)' is used for construction of
> the coordinates.
>
> Can someone explain me this difference? And optionally how to plot text
> in the "topleft" part of the plot without using legend?
>
> Thanks,
> Xavier
>
> --
> Xavier Robin
>
> Biomedical Proteomics Research Group (BPRG)
> Department of Structural Biology and Bioinformatics (DBSB)
> Geneva University Medical Center (CMU)
> 1, rue Michel Servet - CH-1211 Genève 4 - Switzerland
> Tel: (+41 22) 379 53 21
> Fax: (+41 22) 379 59 84
> Xavier.Robin at unige.ch
>
> ______________________________________________
> 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