[R] about changing line type and line width in Taylor Diagram

Jim Lemon jim at bitwrit.com.au
Tue Jan 31 09:20:41 CET 2012


On 01/30/2012 11:09 PM, Roopashree Shrivastava wrote:
> Dear all,
>   I am new to plotting Taylor Diagram using plotrix package within R, hence
> this post. I have written a script which plots Taylor Diagram with one
> reference and 7 model values. However the font size, line width and line
> type are not clear when saving the diagram as a jpeg file. I tried the
> functions lty, lwd and font but no apparent change. I am attaching the
> script here. Any help would be greatly appreciated. The script is...
>
Hi Roopa,
If by "not clear" you mean that the figure (especially the text) is 
generally a bit fuzzy, you probably want to use a device like PDF or 
Postscript.

If you mean that you want larger text on the axes, I have added an 
argument "cex.axis" to the function below that allows the user to get a 
bit of text expansion. This will appear in the next version of plotrix.

About line width and type, there seems to be a convention on the line 
types used in Taylor diagrams, but additional arguments could be added 
to modify these if you really need them. If you want to change the font, 
do it as in the example below.

I found that using only the positive correlations produced a much 
clearer plot, so you may want to try this somewhat altered example:

ref<-c(0.00640091,0.00533091,0.00381636,0.00275519,0.00277649,
  0.00280806,0.00267945,0.00237123,0.000970663,0.000986191,
  0.00100226,0.00086391,0.000622819,0.000485319,
  0.000362976,0.000246112,0.000165615,0.00008184,0.00004)
m1<-c(0.0124827,0.011662,0.0102956,0.0091183,0.00813907,
  0.007192,0.00662517,0.00433745,0.00184044,0.000649477,
  0.00024642,5.43E-05,0.000097696,0.000194817,
  0.000182709,0.000134398,0.000106024,8.92E-05,6.28E-05)
m2<-c(0.0101348,0.00920886,0.0086196,0.00785134,0.00723838,
  0.00675833,0.00579093,0.00540478,0.00226489,0.000809049,
  0.00019625,3.95E-05,8.89E-05,0.000195028,
  0.000185004,0.000131202,0.000109852,9.98E-05,6.80E-05)
m3<-c(0.0123251,0.0120384,0.00871793,0.00678519,0.00628331,
  0.00532673,0.00486861,0.0048328,0.0038655,0.00143683,
  0.00022057,8.61E-06,7.79E-05,0.000184976,
  0.000185927,0.000133771,0.000104613,9.26E-05,6.38E-05)
m4<-c(0.0134251,0.0126776,0.012559,0.0121933,0.0099911,
  0.00727952,0.00475407,0.00227909,0.00130748,0.000705607,
  0.000304828,5.70E-05,0.000109972,0.000187504,
  0.0002016,0.000133706,0.000109697,9.54E-05,6.35E-05)
m5<-c(0.0124275,0.0112242,0.00886243,0.00793019,0.0067846,
  0.00603205,0.00566561,0.00530552,0.00318331,0.000961854,
  0.000218234,3.66E-05,7.99E-05,0.000182724,
  0.000196627,0.000136862,0.000104907,0.000094622,6.20E-05)
m6<-c(0.0142817,0.0134474,0.0129694,0.0113914,0.0102208,
  0.00920309,0.00555206,0.00289796,0.00143831,0.000706277,
  0.000277201,5.60E-05,0.000114714,0.000186412,
  0.000198743,0.000134991,0.000108689,9.43E-05,6.16E-05)
m7<-c(0.0120621,0.0117936,0.00854782,0.00734006,0.00669576,
  0.00629334,0.00595018,0.00564455,0.00396859,0.000991006,
  0.000171742,9.68E-06,8.10E-05,0.000186982,
  0.00018854,0.000136548,0.000104581,9.18E-05,6.20E-05)
par(family="serif")
taylor.diagram(ref,m1,ngamma=3,pch=19,pcex=2,cex.axis=1.2,
  lty=1,lwd=10,font=5)
taylor.diagram(ref,m2,add=TRUE,pch=19,pcex=2,col="blue",
  lty="solid",lwd=3)
taylor.diagram(ref,m3,add=TRUE,pch=19,pcex=2,col="orange",
  lty="solid",lwd=3)
taylor.diagram(ref,m4,add=TRUE,pch=19,pcex=2,col="pink",
  lty="solid",lwd=3)
taylor.diagram(ref,m5,add=TRUE,pch=19,pcex=2,col="purple",
  lty="solid",lwd=3)
taylor.diagram(ref,m6,add=TRUE,pch=19,pcex=2,col="brown",
  lty="solid",lwd=3)
taylor.diagram(ref,m7,add=TRUE,pch=19,pcex=2,col="cyan",
  lty="solid",lwd=3)
lpos<-3.5*sd(ref)
legend(lpos,1.1*lpos,
  legend=c("1111","1171","1211","2121","2221","4141","5251"),
  pch=19,
  col=c("red","blue","orange","pink","purple","brown","cyan"))

Jim

# Display a Taylor diagram
# Taylor K.E. (2001)
# Summarizing multiple aspects of model performance in a single diagram
# Journal of Geophysical Research, 106: 7183-7192.

# version 1.0
# progr. Olivier.Eterradossi, 12/2007
# 2007-01-12 - modifications and Anglicizing - Jim Lemon
# version 2.0
# progr. initiale OLE, 8/01/2007
# rev. OLE 3/09/2008 : remove samples with NA's from mean, sd and cor 
calculations
# 2008-09-04 - integration and more anglicizing - Jim Lemon
# 2008-12-09 - added correlation radii, sd arcs to the pos.cor=FALSE routine
# and stopped the pos.cor=FALSE routine from calculating arcs for zero 
radius
# Jim Lemon
# 2010-4-30 - added the gamma.col argument for pos.cor=TRUE plots - Jim 
Lemon
# 2010-6-24 - added mar argument to pos.cor=TRUE plots - Jim Lemon
# 2012-1-31 - added the cex.axis argument - Jim Lemon

taylor.diagram<-function(ref,model,add=FALSE,col="red",pch=19,pos.cor=TRUE,
  xlab="",ylab="",main="Taylor 
Diagram",show.gamma=TRUE,ngamma=3,gamma.col=8,
  sd.arcs=0,ref.sd=FALSE,grad.corr.lines=c(0.2,0.4,0.6,0.8,0.9),pcex=1,
  cex.axis=1,normalize=FALSE,mar=c(5,4,6,6),...) {

  grad.corr.full<-c(0,0.2,0.4,0.6,0.8,0.9,0.95,0.99,1)

  R<-cor(ref,model,use="pairwise")

  sd.r<-sd(ref)
  sd.f<-sd(model)
  if(normalize) {
   sd.f<-sd.f/sd.r
   sd.r<-1
  }
  maxsd<-1.5*max(sd.f,sd.r)
  oldpar<-par("mar","xpd","xaxs","yaxs")

  if(!add) {
   # display the diagram
   if(pos.cor) {
    if(nchar(ylab) == 0) ylab="Standard deviation"
    par(mar=mar)
    plot(0,xlim=c(0,maxsd),ylim=c(0,maxsd),xaxs="i",yaxs="i",axes=FALSE,
     main=main,xlab=xlab,ylab=ylab,type="n",cex=cex.axis,...)
    if(grad.corr.lines[1]) {
     for(gcl in grad.corr.lines)
      lines(c(0,maxsd*gcl),c(0,maxsd*sqrt(1-gcl^2)),lty=3)
    }
    # add the axes
    segments(c(0,0),c(0,0),c(0,maxsd),c(maxsd,0))
    axis.ticks<-pretty(c(0,maxsd))
    axis.ticks<-axis.ticks[axis.ticks<=maxsd]
    axis(1,at=axis.ticks,cex.axis=cex.axis)
    axis(2,at=axis.ticks,cex.axis=cex.axis)
    if(sd.arcs[1]) {
     if(length(sd.arcs) == 1) sd.arcs<-axis.ticks
     for(sdarc in sd.arcs) {
      xcurve<-cos(seq(0,pi/2,by=0.03))*sdarc
      ycurve<-sin(seq(0,pi/2,by=0.03))*sdarc
      lines(xcurve,ycurve,col="blue",lty=3)
     }
    }
    if(show.gamma[1]) {
     # if the user has passed a set of gamma values, use that
     if(length(show.gamma) > 1) gamma<-show.gamma
     # otherwise make up a set
     else gamma<-pretty(c(0,maxsd),n=ngamma)[-1]
     if(gamma[length(gamma)] > maxsd) gamma<-gamma[-length(gamma)]
     labelpos<-seq(45,70,length.out=length(gamma))
     # do the gamma curves
     for(gindex in 1:length(gamma)) {
      xcurve<-cos(seq(0,pi,by=0.03))*gamma[gindex]+sd.r
      # find where to clip the curves
      endcurve<-which(xcurve<0)
      endcurve<-ifelse(length(endcurve),min(endcurve)-1,105)
      ycurve<-sin(seq(0,pi,by=0.03))*gamma[gindex]
      maxcurve<-xcurve*xcurve+ycurve*ycurve
      startcurve<-which(maxcurve>maxsd*maxsd)
      startcurve<-ifelse(length(startcurve),max(startcurve)+1,0)
      lines(xcurve[startcurve:endcurve],ycurve[startcurve:endcurve],
       col=gamma.col)
      if(xcurve[labelpos[gindex]] > 0)
       boxed.labels(xcurve[labelpos[gindex]],ycurve[labelpos[gindex]],
        gamma[gindex],border=FALSE)
     }
    }
    # the outer curve for correlation
    xcurve<-cos(seq(0,pi/2,by=0.01))*maxsd
    ycurve<-sin(seq(0,pi/2,by=0.01))*maxsd
    lines(xcurve,ycurve)
    bigtickangles<-acos(seq(0.1,0.9,by=0.1))
    medtickangles<-acos(seq(0.05,0.95,by=0.1))
    smltickangles<-acos(seq(0.91,0.99,by=0.01))
    segments(cos(bigtickangles)*maxsd,sin(bigtickangles)*maxsd,
     cos(bigtickangles)*0.97*maxsd,sin(bigtickangles)*0.97*maxsd)
    par(xpd=TRUE)
    if(ref.sd) {
     # the inner curve for reference SD
     xcurve<-cos(seq(0,pi/2,by=0.01))*sd.r
     ycurve<-sin(seq(0,pi/2,by=0.01))*sd.r
     lines(xcurve,ycurve)
    }
    points(sd.r,0,cex=pcex)
    text(cos(c(bigtickangles,acos(c(0.95,0.99))))*1.05*maxsd,
     sin(c(bigtickangles,acos(c(0.95,0.99))))*1.05*maxsd,
     c(seq(0.1,0.9,by=0.1),0.95,0.99))
    text(maxsd*0.8,maxsd*0.8,"Correlation",srt=315)
    segments(cos(medtickangles)*maxsd,sin(medtickangles)*maxsd,
     cos(medtickangles)*0.98*maxsd,sin(medtickangles)*0.98*maxsd)
    segments(cos(smltickangles)*maxsd,sin(smltickangles)*maxsd,
     cos(smltickangles)*0.99*maxsd,sin(smltickangles)*0.99*maxsd)
   }
   else {
    x<- ref
    y<- model

    R<-cor(x,y,use="pairwise.complete.obs")

    E<-mean(x,na.rm=TRUE)-mean(y,na.rm=TRUE) # overall bias

    xprime<-x-mean(x,na.rm=TRUE)
    yprime<-y-mean(y,na.rm=TRUE)
    sumofsquares<-(xprime-yprime)^2
    Eprime<-sqrt(sum(sumofsquares)/length(complete.cases(x))) # centered 
pattern RMS
    E2<-E^2+Eprime^2
    if (add==FALSE) {
     # pourtour du diagramme (display the diagram)
     maxray<-1.5*max(sd.f,sd.r)
 
plot(c(-maxray,maxray),c(0,maxray),type="n",asp=1,bty="n",xaxt="n",yaxt="n",
      xlab=xlab,ylab=ylab,main=main,cex=cex.axis)
     discrete<-seq(180,0,by=-1)
     listepoints<-NULL
     for (i in discrete){
 
listepoints<-cbind(listepoints,maxray*cos(i*pi/180),maxray*sin(i*pi/180))
     }
     listepoints<-matrix(listepoints,2,length(listepoints)/2)
     listepoints<-t(listepoints)
     lines(listepoints[,1],listepoints[,2])

     # axes x,y
     lines(c(-maxray,maxray),c(0,0))
     lines(c(0,0),c(0,maxray))

     # lignes radiales jusqu'� R = +/- 0.8
     for (i in grad.corr.lines){
      lines(c(0,maxray*i),c(0,maxray*sqrt(1-i^2)),lty=3)
      lines(c(0,-maxray*i),c(0,maxray*sqrt(1-i^2)),lty=3)
     }

     # texte radial
     for (i in grad.corr.full){

      text(1.05*maxray*i,1.05*maxray*sqrt(1-i^2),i,cex=0.6)
      text(-1.05*maxray*i,1.05*maxray*sqrt(1-i^2),-i,cex=0.6)
     }

     # sd concentriques autour de la reference

     seq.sd<-seq.int(0,2*maxray,by=(maxray/10))[-1]
     for (i in seq.sd){
      xcircle<-sd.r+(cos(discrete*pi/180)*i)
      ycircle<-sin(discrete*pi/180)*i
      for (j in 1:length(xcircle)){
       if ((xcircle[j]^2+ycircle[j]^2)<(maxray^2)){
        points(xcircle[j],ycircle[j], col="darkgreen",pch=".")
        if(j==10)
         text(xcircle[j],ycircle[j],signif(i,2),cex=0.5,col="darkgreen")
       }
      }
     }

     # sd concentriques autour de l'origine

     seq.sd<-seq.int(0,maxray,length.out=5)
     for (i in seq.sd){
      xcircle<-(cos(discrete*pi/180)*i)
      ycircle<-sin(discrete*pi/180)*i
      if(i) lines(xcircle,ycircle,lty=3,col="blue")
      text(min(xcircle),-0.03*maxray,signif(i,2),cex=0.5,col="blue")
      text(max(xcircle),-0.03*maxray,signif(i,2),cex=0.5,col="blue")
     }

     text(0,-0.08*maxray,"Standard Deviation",cex=0.7,col="blue")
     text(0,-0.12*maxray,"Centered RMS Difference",cex=0.7,col="darkgreen")
     points(sd.r,0,pch=22,bg="darkgreen",cex=1.1)

     text(0,1.1*maxray,"Correlation Coefficient",cex=0.7)
    }



    S<-(2*(1+R))/(sd.f+(1/sd.f))^2
#   Taylor<-S
   }
  }

  # display the points
  points(sd.f*R,sd.f*sin(acos(R)),pch=pch,col=col,cex=pcex)
  invisible(oldpar)
}



More information about the R-help mailing list