[R] Legend text populated with calculated values and super script?

Jim Lemon jim at bitwrit.com.au
Sat Feb 8 01:30:49 CET 2014


On 02/08/2014 02:54 AM, Douglas M. Hultstrand wrote:
> Hello,
>
> I am trying to generate a plot legend that contains calculated summary
> statistics, one statistic is R^2.  I have tried several variations using
> the commands "expression" and "bqoute" as stated on the R help pages.  I
> have not been able to get the R^2 super script correct along with the
> calculated statistics.
>
> I provided an example below, what I want is the legend (wdt_leg and
> spas_leg) as below but with the R^2 as superscript.
>
> # Example Data
> x=c(1,2,3,4);  y=c(1,2,3,4); z=c(1.25,1.5,2.5,3.5)
>
> # first stats based on data, used to populate legend
> wdt_n = 50;  wdt_mbias = 0.58
> wdt_mae = 2.1;  wdt_R2 = 0.85
> # second stats based on data, used to populate legend
> spas_n = 50; spas_mbias = 0.58
> spas_mae = 2.1; spas_R2 = 0.85
>
> # create legend
> wdt_leg<- paste("WDT (N = ", wdt_n,", Bias = ",wdt_mbias,", MAE =
> ",wdt_mae, ", R2 = ", wdt_R2, ")", sep="")
> spas_leg<- paste("SPAS (N = ", spas_n,", Bias = ",spas_mbias,", MAE =
> ",spas_mae, ", R2 = ", spas_R2, ")", sep="")
>
> # create plot
> plot(x,y, col="red1", pch=1); lines(x,z, type="p", col="green4",pch=3)
> leg.txt<- c(spas_leg, wdt_leg)
> legend("topleft", legend = leg.txt, col=c("red1","green4"), pch=c(1,3),
> cex=0.85)
>
Hi Doug,
I set out to get your legend strings turned into expressions and after 
several tries, gave up. Getting superscripts and subscripts in base 
graphics is fairly easy:

supsubtext<-function(x,y,label,sup=NA,sub=NA,xadj=0.5,...) {
  nlabchar<-nchar(label)
  yadj<-rep(0.5,nlabchar)
  if(!is.na(sup)) yadj[sup]<-0
  if(!is.na(sub)) yadj[sub]<-1
  labbits<-strsplit(label,"")[[1]]
  currentx<-x
  for(labchar in 1:nlabchar) {
   text(x,y,labbits[labchar],adj=c(xadj,yadj[labchar]),...)
   x<-x+strwidth(labbits[labchar])
  }
}

The above function will display a line of text in which any character 
the index of which is in "sup" will be superscripted and any in "sub" 
will be subscripted. It is possible to add "cex" values to reduce the 
size of those characters if necessary. You can then construct a 
serviceable legend manually like this:

plot(x,y, col="red1", pch=1); lines(x,z, type="p", col="green4",pch=3)
points(c(1,1),c(3.9,3.7),pch=c(1,3),col=c("red1","green4"))
wdt_leg<-"WDT (N = 50, Bias = 0.58, MAE = 2.1, R2 = 0.85)"
spas_leg<-"SPAS (N = 50, Bias = 0.58, MAE = 2.1, R2 = 0.85)"
supsubtext(1.2,3.9,spas_leg,sup=40)
supsubtext(1.2,3.7,wdt_leg,sup=40)
xylim<-par("usr")
segments(c(xylim[1],3.4),c(3.5,3.5),c(3.4,3.4),c(3.5,xylim[4]))

I am sure that someone more expert with expressions will post a more 
elegant solution.

Jim




More information about the R-help mailing list