This is more complicated, but it could be rolled up into a function. Replace your mtext() call with the following:
# Set character expansion size cx <- 2.5 # Get the plot coordinates and the character size ur <- par("usr")[c(1, 4)] chr <- par("cxy") rect(ur[1]+chr[1]/10, ur[2]-chr[2]*cx, ur[1]+chr[1]*cx, ur[2]-chr[1]/10, border=NA, col="white") text(ur[1]+chr[1]*cx/2, ur[2]-chr[2]*cx/2, "a", font=2, cex=2.5, col="red") 1) Assign to cx the cex= value that you are using in text(). 2) Then get the upper right corner of the plot window and the size of the default character width in user coordinate units. 3) Draw a white rectangle the size of the character you are plotting (in this case cex=2.5). Shrink the left and top edge so that the box around the plot area is not obscured. 4) Plot your character in the center of the box. ------------------------------------- David L Carlson Department of Anthropology Texas A&M University College Station, TX 77840-4352 -----Original Message----- From: R-help [mailto:r-help-boun...@r-project.org] On Behalf Of Pascal A. Niklaus Sent: Monday, February 9, 2015 10:27 AM To: r-help@r-project.org Subject: [R] Coordinate or top left corner + offset Dear all, I am struggling to add annotations to panels of a series of plots arranged on a page. Basically, I'd like to add letters enumerating the panels ("a","b","c",...), at a fixed distance from the top left corner of the plot's "box". I succeeded partly with "mtext" (see below), but the "at" option is in user coordinates, which makes is difficult to specify a given offset from the corner (e.g. 1cm from top and left). I tried grid's "npc" but these coordinates refer to the entire plot instead of the current inner plotting region. Phrased differently, I'd like to place text (and ideally also be able to plot, e.g. a white disc to cover background items) at position (top-1cm,left+1cm) Here is a minimum working example illustrating what I try to achieve: pdf("example.pdf",width=15,height=15) m <- rbind( c(0.1,0.9,0.1,0.6), c(0.1,0.9,0.6,0.9) ); split.screen(m) screen(1); par(mar=c(0,0,0,0)); plot(rnorm(10),rnorm(10),xlim=c(-5,5),xaxt="n",yaxt="n"); mtext(quote(bold(a)),side=3,line=-2.5,at=-5,cex=2.5) screen(2); par(mar=c(0,0,0,0)); plot(rnorm(10),rnorm(10),xlim=c(-3,3),xaxt="n",yaxt="n"); mtext(quote(bold(a)),side=3,line=-2.5,at=-3,cex=2.5) close.screen(all.screens=TRUE) dev.off() Thanks for your help Pascal Niklaus ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.