taylor/taylor_diagram.ncl.0
changeset 1 4be95183fbcd
equal deleted inserted replaced
-1:000000000000 0:2d0abe576fd5
       
     1 function taylor_diagram (wks:graphic ,RATIO[*][*]:numeric, CC[*][*]:numeric \
       
     2                                      ,rOpts:logical)
       
     3 ;--------------------------------------------------------------------
       
     4 ; This version of taylor_diagram supports "paneling"
       
     5 ; It requires NCL version 4.2.0.a034 because it uses "gsn_create_legend"
       
     6 ;--------------------------------------------------------------------
       
     7 
       
     8 ;
       
     9 ; Generate a Taylor Diagram:
       
    10 ; Generate Multiple Aspects of Model Performance in a Single Diagram
       
    11 ; Taylor, K. E., J. Geophys. Res., 106, D7, 7183-7192, 2001
       
    12 ;
       
    13 ; An example:
       
    14 ; http://www.grida.no/climate/ipcc_tar/wg1/fig8-4.htm
       
    15 ;
       
    16 ; This expects one or more datasets. The left dimension 
       
    17 ; is the number of datasets. The rightmost is the number of pts.
       
    18 ;
       
    19 ; Markers are at: 
       
    20 ; http://www.ncl.ucar.edu/Document/Graphics/Resources/gs.shtml
       
    21 ;
       
    22 ; By default, the function can handle up to 10 variable comparisons..
       
    23 ; To expand ...  modify the 'Colors' and 'Markers' attributes.
       
    24 ; The user can change / add some default settings.
       
    25 ;
       
    26 ; The defaults that the user can modify:
       
    27 ;
       
    28 ; rOpts                 = True 
       
    29 ;                                  ; 'made-up' resources
       
    30 ; rOpts@Colors          =  (/ "blue" , "red", "green", "cyan", "black" \
       
    31 ;                           , "torquoise", "brown", "yellow"/)
       
    32 ; rOpts@Markers         =  (/ 2, 3, 6, 14, 9, 12, 7, 4/) ; Marker Indices
       
    33 ; rOpts@markerTxOffset  = 0.0175   ; offset for text above marker
       
    34 ; rOpts@stnRad          = (/ 1. /) ;  (/ 0.50, 0.75, 1.5 /) 
       
    35 ; rOpts@centerDiffRMS   = False    ;  True mean draw additional radii from REF 
       
    36 ; rOpts@caseLabelsFontHeightF = 0.05
       
    37 ; rOpts@varLabelsFontHeightF  = 0.013
       
    38 ; rOpts@varLabelsYloc         = 0.65
       
    39 ; rOpts@legendWidth           = 0.015
       
    40 ; rOpts@legendHeight          = 0.030*nCase
       
    41 ; rOpts@taylorDraw            = True
       
    42 ; rOpts@taylorFrame           = True
       
    43 ;
       
    44 ;                                  ; standard NCL resources
       
    45 ; rOpts@tiMainString    = "Taylor" ; not using title makes plot bigger
       
    46 ; rOpts@gsMarkerSizeF   = 0.0085   ; marker size   
       
    47 ; rOpts@gsMarkerThicknessF = 1.0
       
    48 ; rOpts@txFontHeightF   = 0.0125   ; text size 
       
    49 ; rOpts@tiMainFontHeightF = 0.0225 ; tiMainString size
       
    50 ;
       
    51 ; It returns to the user a graphic object containing the 
       
    52 ; Taylor background and plotted x/y pts.
       
    53 ; This graphic object contains a simple Taylor background appropriate
       
    54 ; for standardized data and the markers for the datasets.
       
    55 ; ==================================================================
       
    56 ; This version allows paneling:
       
    57 ;      The 'cumbersome' "dum" variables were added by 
       
    58 ;      Adam Phillips to allow paneling via "gsn_add_?".
       
    59 ; ==================================================================
       
    60 begin
       
    61   dimR                  = dimsizes(RATIO)
       
    62   nCase                 = dimR(0)    ; # of cases [models] 
       
    63   nVar                  = dimR(1)    ; # of variables
       
    64 
       
    65                                      ; x/y coordinates for plotting
       
    66   X    = new ( (/nCase,nVar/) , typeof(RATIO) )
       
    67   Y    = new ( (/nCase,nVar/) , typeof(RATIO) )
       
    68 
       
    69   do nc=0,nCase-1
       
    70      angle      = acos( CC(nc,:) )   ; array operation                                    
       
    71      X(nc,:)    = RATIO(nc,:)*cos( angle )     
       
    72      Y(nc,:)    = RATIO(nc,:)*sin( angle )    
       
    73   end do
       
    74 
       
    75   xyMin                 = 0.  
       
    76   xyOne                 = 1.00
       
    77   xyMax                 = 1.65
       
    78   xyMax_Panel           = xyMax+ 0.10            ; paneling purposes
       
    79  
       
    80   if (rOpts .and. isatt(rOpts,"txFontHeightF"))  then 
       
    81       FontHeightF       = rOpts@txFontHeightF    ; user wants to specify size
       
    82   else
       
    83       FontHeightF       = 0.0175
       
    84   end if
       
    85  
       
    86 ; ----------------------------------------------------------------
       
    87 ; Part 1:
       
    88 ; base plot: Based upon request of Mark Stevens
       
    89 ; basic x-y and draw the 1.0 observed and the outer curve at 1.65
       
    90 ; ----------------------------------------------------------------
       
    91   
       
    92   rxy                   = True       
       
    93   rxy@gsnDraw           = False
       
    94   rxy@gsnFrame          = False
       
    95   rxy@vpHeightF         = 0.65
       
    96   rxy@vpWidthF          = 0.65
       
    97   rxy@tmYLBorderOn      = False
       
    98   rxy@tmXBBorderOn      = False
       
    99 
       
   100   rxy@tiYAxisString     = "Standardized Deviations (Normalized)"
       
   101   rxy@tiYAxisFontHeightF= FontHeightF                        ; default=0.025 
       
   102   
       
   103   rxy@tmXBMode          = "Explicit" 
       
   104   rxy@tmXBValues        = (/0.0,0.25,0.50,0.75,1.00,1.25,1.5/)    ; major tm
       
   105                                                                   ; default  "OBS" or "REF"
       
   106  ;rxy@tmXBLabels        = (/"0.00","0.25","0.50","0.75","REF" ,"1.25","1.50"/)
       
   107   rxy@tmXBLabels        = (/"    ","0.25","0.50","0.75","REF" ,"1.25","1.50"/)
       
   108   if (rOpts .and. isatt(rOpts,"OneX") )  then                     ; eg: rOpts@OneX="1.00" 
       
   109      ;rxy@tmXBLabels        = (/"0.00","0.25","0.50","0.75",rOpts@OneX,"1.25","1.50"/)
       
   110       rxy@tmXBLabels        = (/"    ","0.25","0.50","0.75",rOpts@OneX,"1.25","1.50"/)
       
   111   end if
       
   112 
       
   113   rxy@tmXBMajorLengthF  = 0.015      ; default=0.02 for a vpHeightF=0.6
       
   114   rxy@tmXBLabelFontHeightF = FontHeightF
       
   115   rxy@tmXBMinorOn       = False
       
   116   rxy@trXMaxF           = xyMax_Panel
       
   117 
       
   118   rxy@tmYLMode          = "Manual"
       
   119   rxy@tmYLMinorOn       = False
       
   120   rxy@tmYLMajorLengthF  = rxy@tmXBMajorLengthF
       
   121   rxy@tmYLLabelFontHeightF = FontHeightF
       
   122   rxy@tmYLMode          = "Explicit" 
       
   123   rxy@tmYLValues        = (/0.0, .25,0.50, 0.75, 1.00, 1.25, 1.5/) ; major tm
       
   124   rxy@tmYLLabels        = (/"0.00","0.25","0.50","0.75","1.00","1.25","1.50"/)
       
   125  ;rxy@tmYLLabels        = (/"    ","0.25","0.50","0.75","1.00","1.25","1.50"/)
       
   126   rxy@trYMaxF           = xyMax_Panel
       
   127 
       
   128   rxy@tmYRBorderOn      = False
       
   129   rxy@tmYROn            = False      ; Turn off right tick marks.
       
   130 
       
   131   rxy@tmXTBorderOn      = False
       
   132   rxy@tmXTOn            = False      ; Turn off right tick marks.
       
   133 
       
   134   rxy@xyDashPatterns    = (/ 0 /)    ; line characteristics (dash,solid)
       
   135   rxy@xyLineThicknesses = (/ 2./)    ; choose line thickness
       
   136 
       
   137   rxy@gsnFrame          = False      ; Don't advance the frame.
       
   138 
       
   139                                             ; create outer 'correlation axis'
       
   140   npts    = 200                        ; arbitrary
       
   141   xx      = fspan(xyMin,xyMax,npts) 
       
   142   yy      = sqrt(xyMax^2 - xx^2    )   ; outer correlation line (xyMax)
       
   143 
       
   144   sLabels = (/"0.0","0.1","0.2","0.3","0.4","0.5","0.6" \ ; correlation labels
       
   145              ,"0.7","0.8","0.9","0.95","0.99","1.0"     /); also, major tm
       
   146   cLabels = stringtofloat(sLabels)
       
   147   rad     = 4.*atan(1.0)/180.
       
   148   angC    = acos(cLabels)/rad                     ; angles: correlation labels
       
   149                                                                        
       
   150   if (rOpts .and. isatt(rOpts,"tiMainString")) then
       
   151       rxy@tiMainString      = rOpts@tiMainString
       
   152      ;rxy@tiMainOffsetYF    = 0.015               ; default  0.0
       
   153       if (isatt(rOpts,"tiMainFontHeightF")) then
       
   154            rxy@tiMainFontHeightF = rOpts@tiMainFontHeightF
       
   155       else
       
   156            rxy@tiMainFontHeightF = 0.0225         ; default  0.025              
       
   157       end if
       
   158   end if
       
   159 ;;if (rOpts .and. isatt(rOpts,"gsnCenterString")) then
       
   160 ;;    rxy@gsnCenterString  = rOpts@gsnCenterString      ; only gsn_csm_xy
       
   161 ;;end if
       
   162 
       
   163   taylor  = gsn_xy(wks,xx,yy,rxy)                 ; Create and draw XY plot.
       
   164 
       
   165   rsrRes  = True
       
   166   rsrRes@gsLineThicknessF  = rxy@xyLineThicknesses(0)  ; line thickness
       
   167   rsrRes@gsLineDashPattern = 0                    ; solid line pattern
       
   168                                                   ; draw x and y to xyMax
       
   169   dum0 = gsn_add_polyline(wks,taylor,(/0.,  0. /),(/0.,xyMax/), rsrRes)
       
   170   dum1 = gsn_add_polyline(wks,taylor,(/0.,xyMax/),(/0.,  0. /), rsrRes)
       
   171 
       
   172   xx   = fspan(xyMin, xyOne ,npts)                ; draw 1.0 standard radius
       
   173   yy   = sqrt(xyOne - xx^2)   
       
   174   rsrRes@gsLineDashPattern = 1                    ; dashed line pattern
       
   175   rsrRes@gsLineThicknessF  = rxy@xyLineThicknesses(0)  ; line thickness
       
   176   dum2 = gsn_add_polyline(wks,taylor,xx,yy, rsrRes)
       
   177   delete(xx)
       
   178   delete(yy)
       
   179                                                   
       
   180   if (rOpts .and. isatt(rOpts,"stnRad") ) then
       
   181       rsrRes@gsLineThicknessF  = 1   ; rxy@xyLineThicknesses(0)  
       
   182       nStnRad = dimsizes(rOpts@stnRad)
       
   183 
       
   184       dum3  = new(nStnRad,graphic)
       
   185       do n=0,nStnRad-1
       
   186          rr = rOpts@stnRad(n)
       
   187          xx = fspan(xyMin, rr ,npts) 
       
   188          yy = sqrt(rr^2   - xx^2)   
       
   189          dum3(n) = gsn_add_polyline(wks,taylor,xx,yy, rsrRes)
       
   190       end do
       
   191       taylor@$unique_string("dum")$ = dum3
       
   192 
       
   193       delete(xx)
       
   194       delete(yy)
       
   195   end if
       
   196 
       
   197   getvalues taylor                                ; get style info from taylor
       
   198     "tmYLLabelFont"        : tmYLLabelFont        ; use for correlation axis
       
   199     "tmYLLabelFontHeightF" : tmYLLabelFontHeightF
       
   200   end getvalues
       
   201 
       
   202 ; ----------------------------------------------------------------
       
   203 ; Part 2:
       
   204 ; Correlation labels
       
   205 ; ----------------------------------------------------------------
       
   206   radC    = xyMax                                  ; for correlation labels
       
   207   xC      = radC*cos(angC*rad)
       
   208   yC      = radC*sin(angC*rad)
       
   209 ; added to get some separation
       
   210   xC      = xC + 0.020*cos(rad*angC)
       
   211   yC      = yC + 0.060*sin(rad*angC)
       
   212 
       
   213   txRes               = True                      ; text mods desired
       
   214   txRes@txFontHeightF = FontHeightF               ; match YL 
       
   215   txRes@tmYLLabelFont = tmYLLabelFont             ; match YL
       
   216   txRes@txAngleF      = -45.
       
   217   if (.not.isatt(rOpts,"drawCorLabel") .or. rOpts@drawCorLabel) then 
       
   218       dum4 = gsn_add_text(wks,taylor,"Correlation",1.30,1.30,txRes)
       
   219 	 taylor@$unique_string("dum")$ = dum4
       
   220   end if
       
   221   txRes@txAngleF      = 0.0 
       
   222   txRes@txFontHeightF = FontHeightF*0.50          ; bit smaller
       
   223 
       
   224 ;;dum0 = gsn_add_text(wks,taylor,"OBSERVED",1.00,0.075,txRes)
       
   225 
       
   226   plRes               = True
       
   227   plRes@gsLineThicknessF = 2.
       
   228   
       
   229   txRes@txJust        = "CenterLeft"              ; Default="CenterCenter".
       
   230   txRes@txFontHeightF = FontHeightF               ; match YL 
       
   231  ;txRes@txBackgroundFillColor = "white"
       
   232 
       
   233   tmEnd = 0.975
       
   234   radTM = xyMax*tmEnd                             ; radius end: major TM 
       
   235   xTM   = new( 2 , "float")
       
   236   yTM   = new( 2 , "float")
       
   237 
       
   238   dum5 = new(dimsizes(sLabels),graphic)
       
   239   dum6 = dum5
       
   240 
       
   241   do i=0,dimsizes(sLabels)-1                      ; Loop to draw strings
       
   242     txRes@txAngleF = angC(i)
       
   243     dum5(i) = gsn_add_text(wks, taylor, sLabels(i),xC(i),yC(i),txRes) ; cor label
       
   244     xTM(0)   = xyMax*cos(angC(i)*rad)             ; major tickmarks at
       
   245     yTM(0)   = xyMax*sin(angC(i)*rad)             ; correlation labels
       
   246     xTM(1)   = radTM*cos(angC(i)*rad)             
       
   247     yTM(1)   = radTM*sin(angC(i)*rad)
       
   248     dum6(i) = gsn_add_polyline(wks,taylor,xTM,yTM,plRes)
       
   249   end do
       
   250                                                   ; minor tm locations
       
   251   mTM     = (/0.05,0.15,0.25,0.35,0.45,0.55,0.65 \ 
       
   252              ,0.75,0.85,0.91,0.92,0.93,0.94,0.96,0.97,0.98  /)
       
   253   angmTM  = acos(mTM)/rad                         ; angles: correlation labels
       
   254   radmTM  = xyMax*(1.-(1.-tmEnd)*0.5)             ; radius end: minor TM 
       
   255 
       
   256   dum7 = new(dimsizes(mTM),graphic)
       
   257 
       
   258   do i=0,dimsizes(mTM)-1                          ; manually add tm
       
   259     xTM(0)   = xyMax*cos(angmTM(i)*rad)           ; minor tickmarks
       
   260     yTM(0)   = xyMax*sin(angmTM(i)*rad)
       
   261     xTM(1)   = radmTM*cos(angmTM(i)*rad)          
       
   262     yTM(1)   = radmTM*sin(angmTM(i)*rad)
       
   263     dum7(i)  = gsn_add_polyline(wks,taylor,xTM,yTM,plRes)
       
   264   end do
       
   265                                                   ; added for Wanli
       
   266   if (rOpts .and. isatt(rOpts,"ccRays") ) then
       
   267       angRL = acos(rOpts@ccRays)/rad             ; angles: radial lines
       
   268 
       
   269       rlRes = True
       
   270       rlRes@xyDashPattern    = 4  ; line pattern
       
   271       rlRes@xyLineThicknessF = 1  ; choose line thickness
       
   272 
       
   273       dum8 = new(dimsizes(angRL),graphic)
       
   274       do i=0,dimsizes(angRL)-1
       
   275          xRL     = xyMax*cos(angRL(i)*rad)
       
   276          yRL     = xyMax*sin(angRL(i)*rad)
       
   277          dum8(i) = gsn_add_polyline(wks,taylor,(/0, xRL /),(/0,  yRL  /),rlRes)
       
   278       end do
       
   279       taylor@$unique_string("dum")$ = dum8
       
   280   end if
       
   281   
       
   282 ; ----------------------------------------------------------------
       
   283 ; Part 3:
       
   284 ; Concentric about 1.0 on XB axis
       
   285 ; I think this is correct. Still test mode.
       
   286 ; ----------------------------------------------------------------
       
   287   if (rOpts .and. isatt(rOpts,"centerDiffRMS") \
       
   288             .and. rOpts@centerDiffRMS) then
       
   289       respl                    = True                ; polyline mods desired
       
   290       respl@gsLineThicknessF   = 1.0                 ; line thickness
       
   291       respl@gsLineColor        = "Black"             ; line color     
       
   292       respl@gsLineDashPattern  = 2                   ; short dash lines
       
   293       
       
   294       dx   = 0.25
       
   295       ncon = 4                                       ; 0.75, 0.50, 0.25, 0.0
       
   296       npts = 100                                     ; arbitrary
       
   297       ang  = fspan(180,360,npts)*rad
       
   298 
       
   299       dum9 = new(ncon,graphic)
       
   300 
       
   301       do n=1,ncon 
       
   302          rr  = n*dx            ; radius from 1.0 [OBS] abscissa
       
   303          xx  = 1. + rr*cos(ang)
       
   304          yy  = fabs( rr*sin(ang) )
       
   305          if (n.le.2) then
       
   306              dum9(n-1) = gsn_add_polyline(wks,taylor,xx,yy,respl)
       
   307          end if
       
   308          if (n.eq.3) then
       
   309              n3 = floattointeger( 0.77*npts ) 
       
   310              dum9(n-1) = gsn_add_polyline(wks,taylor,xx(0:n3),yy(0:n3),respl)
       
   311          end if
       
   312          if (n.eq.4) then
       
   313              n4 = floattointeger( 0.61*npts ) 
       
   314              dum9(n-1) = gsn_add_polyline(wks,taylor,xx(0:n4),yy(0:n4),respl)
       
   315          end if
       
   316       end do
       
   317       delete(ang)
       
   318       delete(xx)
       
   319       delete(yy)
       
   320       taylor@$unique_string("dum")$ = dum9
       
   321 
       
   322   end if
       
   323 ; ---------------------------------------------------------------
       
   324 ; Part 4:
       
   325 ; generic resources that will be applied to all users data points
       
   326 ; of course, these can be changed 
       
   327 ; http://www.ncl.ucar.edu/Document/Graphics/Resources/gs.shtml
       
   328 ; ---------------------------------------------------------------
       
   329   if (rOpts .and. isatt(rOpts,"Markers")) then
       
   330       Markers = rOpts@Markers
       
   331   else
       
   332       Markers = (/ 4, 6, 8,  0, 9, 12, 7, 2, 11, 16/) ; Marker Indices
       
   333   end if
       
   334 
       
   335   if (rOpts .and. isatt(rOpts,"Colors")) then
       
   336       Colors  = rOpts@Colors
       
   337   else
       
   338       Colors  = (/ "red", "blue", "green", "cyan", "orange" \
       
   339                  , "torquoise", "brown", "yellow", "purple", "black"/)
       
   340   end if
       
   341 
       
   342   if (rOpts .and. isatt(rOpts,"gsMarkerThicknessF")) then
       
   343       gsMarkerThicknessF = rOpts@gsMarkerThicknessF
       
   344   else
       
   345       gsMarkerThicknessF = 1.0
       
   346   end if
       
   347 
       
   348   if (rOpts .and. isatt(rOpts,"gsMarkerSizeF")) then
       
   349       gsMarkerSizeF      = rOpts@gsMarkerSizeF
       
   350   else
       
   351       gsMarkerSizeF      = 0.0085                  ; Default: 0.007
       
   352   end if
       
   353 
       
   354   gsRes = True
       
   355   gsRes@gsMarkerThicknessF = gsMarkerThicknessF      ; default=1.0
       
   356   gsRes@gsMarkerSizeF      = gsMarkerSizeF           ; Default: 0.007 
       
   357 
       
   358   ptRes = True                        ; text options for points
       
   359   ptRes@txJust             = "BottomCenter"; Default="CenterCenter".
       
   360   ptRes@txFontThicknessF   = 1.2      ; default=1.00
       
   361   ptRes@txFontHeightF      = 0.0125   ; default=0.05
       
   362   if (rOpts .and. isatt(rOpts,"txFontHeightF")) then
       
   363       ptRes@txFontHeightF  = rOpts@txFontHeightF  
       
   364   end if
       
   365 
       
   366   markerTxYOffset          = 0.0175   ; default
       
   367   if (rOpts .and. isatt(rOpts,"markerTxYOffset")) then
       
   368       markerTxYOffset = rOpts@markerTxYOffset             ; user defined offset
       
   369   end if
       
   370 
       
   371   dum10 = new((nCase*nVar),graphic)
       
   372   dum11 = dum10
       
   373 
       
   374   do n=0,nCase-1
       
   375      gsRes@gsMarkerIndex   = Markers(n)             ; marker style (+)
       
   376      gsRes@gsMarkerColor   = Colors(n)              ; marker color
       
   377      ptRes@txFontColor     = gsRes@gsMarkerColor
       
   378     do i=0,nVar-1
       
   379        dum10(n*nVar+i) = gsn_add_polymarker(wks,taylor,X(n,i),Y(n,i),gsRes) 
       
   380        dum11(n*nVar+i) = gsn_add_text(wks,taylor,(i+1),X(n,i),Y(n,i)+markerTxYOffset,ptRes)
       
   381     end do
       
   382   end do
       
   383 
       
   384 ; ---------------------------------------------------------------
       
   385 ; Part 5: ; add case legend and variable labels
       
   386 ; ---------------------------------------------------------------
       
   387 
       
   388   if (rOpts .and. isatt(rOpts,"caseLabels")) then 
       
   389 
       
   390       if (isatt(rOpts,"caseLabelsFontHeightF")) then
       
   391           caseLabelsFontHeightF = rOpts@caseLabelsFontHeightF
       
   392       else
       
   393           caseLabelsFontHeightF = 0.05  
       
   394       end if
       
   395 
       
   396       lgres                    = True
       
   397       lgres@lgMarkerColors     = Colors        ; colors of markers
       
   398       lgres@lgMarkerIndexes    = Markers       ; Markers 
       
   399       lgres@lgMarkerSizeF      = gsMarkerSizeF ; Marker size
       
   400       lgres@lgItemType         = "Markers"     ; draw markers only
       
   401       lgres@lgLabelFontHeightF = caseLabelsFontHeightF  ; font height of legend case labels
       
   402 
       
   403       if (isatt(rOpts,"legendWidth")) then
       
   404           lgres@vpWidthF       = rOpts@legendWidth
       
   405       else
       
   406           lgres@vpWidthF       = 0.15           ; width of legend (NDC)
       
   407       end if
       
   408 
       
   409       if (isatt(rOpts,"legendHeight")) then
       
   410           lgres@vpHeightF      = rOpts@legendHeight
       
   411       else   
       
   412           lgres@vpHeightF      = 0.030*nCase   ; height of legend (NDC)
       
   413       end if
       
   414 
       
   415       lgres@lgPerimOn          = False         ; turn off perimeter
       
   416       nModel                   = dimsizes( rOpts@caseLabels )
       
   417       lbid = gsn_create_legend(wks,nModel,rOpts@caseLabels,lgres)
       
   418 	 
       
   419       amres = True
       
   420       amres@amParallelPosF     =  0.35           
       
   421       amres@amOrthogonalPosF   = -0.35             
       
   422       annoid1 = gsn_add_annotation(taylor,lbid,amres)	; add legend to plot
       
   423   end if
       
   424 
       
   425   if (rOpts .and. isatt(rOpts,"varLabels")) then 
       
   426       nVar    = dimsizes(rOpts@varLabels)
       
   427 
       
   428       if (isatt(rOpts,"varLabelsFontHeightF")) then
       
   429           varLabelsFontHeightF = rOpts@varLabelsFontHeightF
       
   430       else
       
   431           varLabelsFontHeightF = 0.013
       
   432       end if
       
   433 
       
   434       txres = True
       
   435       txres@txFontHeightF = varLabelsFontHeightF
       
   436       txres@txJust = "CenterLeft"              ; justify to the center left
       
   437 
       
   438      ;delta_y = 0.02       
       
   439       delta_y = 0.06   
       
   440       if (rOpts .and. isatt(rOpts,"varLabelsYloc")) then
       
   441           ys  = rOpts@varLabelsYloc            ; user specified
       
   442       else
       
   443           ys  = max( (/nVar*delta_y , 0.30/) )
       
   444       end if
       
   445 
       
   446       
       
   447       do i = 1,nVar     
       
   448          if (i.eq.1) then
       
   449              dum12 = new(nVar,graphic)
       
   450 	 end if
       
   451 
       
   452          dum12(i-1) = gsn_add_text(wks,taylor,i+" - "+rOpts@varLabels(i-1), .125,ys,txres)
       
   453          ys = ys- delta_y
       
   454       end do
       
   455 
       
   456       taylor@$unique_string("dum")$ = dum12
       
   457   end if
       
   458 
       
   459   taylor@$unique_string("dum")$ = dum0   ; x-axis
       
   460   taylor@$unique_string("dum")$ = dum1   ; y-axis
       
   461   taylor@$unique_string("dum")$ = dum2   ; 1.0 std curve
       
   462   taylor@$unique_string("dum")$ = dum5   ; labels [COR]
       
   463   taylor@$unique_string("dum")$ = dum6   ; major tm [COR]
       
   464   taylor@$unique_string("dum")$ = dum7   ; minor tm
       
   465   taylor@$unique_string("dum")$ = dum10  ; markers
       
   466   taylor@$unique_string("dum")$ = dum11  ; text
       
   467   
       
   468   if (.not.isatt(rOpts,"taylorDraw") .or. \
       
   469      (isatt(rOpts,"taylorDraw") .and. rOpts@taylorDraw)) then 
       
   470 	draw(taylor)
       
   471   end if
       
   472   if (.not.isatt(rOpts,"taylorFrame") .or. \
       
   473      (isatt(rOpts,"taylorFrame") .and. rOpts@taylorFrame)) then 
       
   474 	frame(wks)
       
   475   end if
       
   476   return(taylor)
       
   477 end
       
   478