all/taylor_diagram.ncl
author Forrest Hoffman <forrest@climatemodeling.org>
Mon, 26 Jan 2009 22:08:20 -0500
changeset 0 0c6405ab2ff4
permissions -rw-r--r--
Initial commit of C-LAMP Diagnostics from Jeff Lee
     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 Deviation (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           caseLabelsFontHeightF = 0.15  
   395       end if
   396 
   397       lgres                    = True
   398       lgres@lgMarkerColors     = Colors        ; colors of markers
   399       lgres@lgMarkerIndexes    = Markers       ; Markers 
   400       lgres@lgMarkerSizeF      = gsMarkerSizeF ; Marker size
   401       lgres@lgItemType         = "Markers"     ; draw markers only
   402       lgres@lgLabelFontHeightF = caseLabelsFontHeightF  ; font height of legend case labels
   403 
   404       if (isatt(rOpts,"legendWidth")) then
   405           lgres@vpWidthF       = rOpts@legendWidth
   406       else
   407           lgres@vpWidthF       = 0.15           ; width of legend (NDC)
   408       end if
   409 
   410       if (isatt(rOpts,"legendHeight")) then
   411           lgres@vpHeightF      = rOpts@legendHeight
   412       else   
   413           lgres@vpHeightF      = 0.030*nCase   ; height of legend (NDC)
   414       end if
   415 
   416       lgres@lgPerimOn          = False         ; turn off perimeter
   417       nModel                   = dimsizes( rOpts@caseLabels )
   418       lbid = gsn_create_legend(wks,nModel,rOpts@caseLabels,lgres)
   419 	 
   420       amres = True
   421       amres@amParallelPosF     =  0.35           
   422       amres@amOrthogonalPosF   = -0.35             
   423       annoid1 = gsn_add_annotation(taylor,lbid,amres)	; add legend to plot
   424   end if
   425 
   426   if (rOpts .and. isatt(rOpts,"varLabels")) then 
   427       nVar    = dimsizes(rOpts@varLabels)
   428 
   429       if (isatt(rOpts,"varLabelsFontHeightF")) then
   430           varLabelsFontHeightF = rOpts@varLabelsFontHeightF
   431       else
   432           varLabelsFontHeightF = 0.013
   433       end if
   434 
   435       txres = True
   436       txres@txFontHeightF = varLabelsFontHeightF
   437       txres@txJust = "CenterLeft"              ; justify to the center left
   438 
   439      ;delta_y = 0.02       
   440       delta_y = 0.06   
   441       if (rOpts .and. isatt(rOpts,"varLabelsYloc")) then
   442           ys  = rOpts@varLabelsYloc            ; user specified
   443       else
   444           ys  = max( (/nVar*delta_y , 0.30/) )
   445       end if
   446 
   447       
   448       do i = 1,nVar     
   449          if (i.eq.1) then
   450              dum12 = new(nVar,graphic)
   451 	 end if
   452 
   453          dum12(i-1) = gsn_add_text(wks,taylor,i+" - "+rOpts@varLabels(i-1), .125,ys,txres)
   454          ys = ys- delta_y
   455       end do
   456 
   457       taylor@$unique_string("dum")$ = dum12
   458   end if
   459 
   460   taylor@$unique_string("dum")$ = dum0   ; x-axis
   461   taylor@$unique_string("dum")$ = dum1   ; y-axis
   462   taylor@$unique_string("dum")$ = dum2   ; 1.0 std curve
   463   taylor@$unique_string("dum")$ = dum5   ; labels [COR]
   464   taylor@$unique_string("dum")$ = dum6   ; major tm [COR]
   465   taylor@$unique_string("dum")$ = dum7   ; minor tm
   466   taylor@$unique_string("dum")$ = dum10  ; markers
   467   taylor@$unique_string("dum")$ = dum11  ; text
   468   
   469   if (.not.isatt(rOpts,"taylorDraw") .or. \
   470      (isatt(rOpts,"taylorDraw") .and. rOpts@taylorDraw)) then 
   471 	draw(taylor)
   472   end if
   473   if (.not.isatt(rOpts,"taylorFrame") .or. \
   474      (isatt(rOpts,"taylorFrame") .and. rOpts@taylorFrame)) then 
   475 	frame(wks)
   476   end if
   477   return(taylor)
   478 end
   479