DKRZ NCL example area weighted y-axis (latitude) annotation#

Example script:

;-------------------------------------------------------------------
; DKRZ NCL example: irregular_axis_labels_dummy_data.ncl
;
; Description: Irregular y-axis labels depending on the
; grid area of the latitudes (sinus(lat*PI/180.).
;
; 14.01.19 kmf
;-------------------------------------------------------------------
;-- global variables
PI = get_pi("float")

;-----------------------------------------------------------
; Procedure draw_y_axis_annotation
;  Annotate the left y-axis irregularly depending of
;  the area grid sizes.
;-----------------------------------------------------------
undef("draw_y_axis_annotation")
procedure draw_y_axis_annotation(wks,plot,yval)
begin

  getvalues plot                     ;-- retrieve viewport settings of plot
     "vpWidthF"  : vpw
     "vpHeightF" : vph
     "vpXF"      : vpx
     "vpYF"      : vpy
  end getvalues

  ylabels = yval + ""                ;-- convert yval to type string
  siny = sin(yval*PI/180.)           ;-- compute sinus values
  ny = dimsizes(yval)                ;-- dimension of yval

  ;-- format the ylabels from -90.-90. to 90S-90N; 0. degrees labeled EQ
  do k=0,ny-1
     if(yval(k) .gt. 0. .and. yval(k).ne. 80.) then
        ylabels(k) = sprintf("%4.1fN",yval(k))
     elseif(yval(k) .eq. 0.) then    ;-- write 'EQ' instead of 0.0
        ylabels(k) = "EQ"
     elseif(yval(k) .eq. 80.) then   ;-- prevent overwriting of y-axis values
        ylabels(k) = ""
     elseif(yval(k) .eq. -80.) then  ;-- prevent overwriting of y-axis values
        ylabels(k) = ""
     else
        t = yval(k)*-1.
        ylabels(k) = sprintf("%4.1fS",t)
     end if
  end do

  ;-- polyline resources
  plres = True
  plres@gsLineThicknessF = 2     ;-- line thickness for tickmarks

  ;-- text resources
  txres = True
  txres@txFontHeightF = 0.014    ;-- y-axis labels: default size is HUGE!
  txres@txJust = "CenterLeft"    ;-- y-axis labels: alignment

  txres1 = txres
  txres1@txFontHeightF = 0.018   ;-- y-axis title
  txres1@txJust = "CenterCenter" ;-- y-axis labels: alignment
  txres1@txAngleF = 90.          ;-- rotate text string 90 degrees

  ;-- compute tickmark locations and add tickmarks and labels to plot
  do i=0,ny-1
     if(i .eq. 0) then
        y = vpy-vph
     else
        y = (siny(i)*vph/2) + (vpy-vph/2)
     end if
     gsn_polyline_ndc(wks, (/vpx-0.01,vpx/), (/y,y/), plres) ;-- left y-axis tickmarks
     gsn_polyline_ndc(wks, (/vpx+vpw,vpx+vpw+0.01/), (/y,y/), plres) ;-- right y-axis tickmarks
     gsn_text_ndc(wks, ylabels(i), vpx-0.07, y, txres) ;-- left y-axis labels
  end do

  gsn_text_ndc(wks, "latitudes", vpx-0.09, vpy-vph/2, txres1)   ;-- left y-axis labels

end   ;-- end function 'draw_y_axis_annotation'

;++++++++++++++++++++++++++++++++++++++++++++++
; MAIN
;++++++++++++++++++++++++++++++++++++++++++++++
begin
  ;-- generate dummy data
  y = ispan(-90,90,1)*1.
  y@standard_name = "latitudes"

  x = cos(0.050*y)
  x@standard_name = "data"

  ;-- open workstation
  wks = gsn_open_wks ("png","plot_irregular_axis_labels_dummy_data")

  ;-- set resources
  res = True
  res@gsnMaximize = True  ;-- maximize graphics output

  res@xyMonoDashPattern = True   ;-- use same dash pattern for all lines
  res@xyDashPattern = 0          ;-- use solid dash pattern
  res@xyLineColor = "blue"       ;-- set line colors
  res@xyLineThicknessF = 3       ;-- set line thickness

  res@gsnYRefLine = 0            ;-- where to draw the reference line
  res@gsnXRefLine = 0            ;-- where to draw the reference line
  res@gsnXRefLineDashPattern = 2 ;-- x reference line dash pattern
  res@gsnYRefLineDashPattern = 2 ;-- y reference line dash pattern

  res@trXMinF = -1.1             ;-- set x-axis minimum
  res@trXMaxF = 1.1              ;-- set x-axis maximum

  res@tiMainFontHeightF = 0.02   ;-- main title font size
  res@tiMainString = "xy-plot"   ;-- title

  ;-- create the base data plot without grid area dependency
  base = gsn_csm_xy(wks,x,y,res)

  ;---------------------------------------------------------------------------
  ;-- compute the area weighted y-values using sinus function
  ;---------------------------------------------------------------------------
  yvalues = sin(tofloat(y)*PI/180.) ;-- values at y-axis of unit circle

  ;-- set resources
  res@gsnDraw = False            ;-- don't draw the plot, yet
  res@gsnFrame = False           ;-- don't advance the frame, yet

  res@trYMinF = -1.0             ;-- needed if we use the 2nd way (sinus)
  res@trYMaxF = 1.0              ;-- needed if we use the 2nd way (sinus)

  res@tmYLOn = False             ;-- don't draw left y-axis tickmarks and labels
  res@tmYROn = False             ;-- don't draw right y-axis tickmarks and labels
  res@tmXBLabelFontHeightF = 0.014 ;-- x-axis labels: default size is HUGE!

  res@tiMainString = "xy-plot with grid area weights"  ;-- title
  res@tiXAxisFontHeightF = 0.016  ;-- x-axis title font size

  ;-- create the data plot with grid area dependency (sin(lat*PI/180))
  plot = gsn_csm_xy(wks,x,yvalues,res)
  draw(plot)  ;-- draw the plot

  ;-- add y-axis labels and tickmarks
  yaxis_values = fspan(-90.,90.,19)  ;-- -90.-90. every 10th degree
  draw_y_axis_annotation(wks,plot,yaxis_values)  ;-- call procedure to add y-axis labels and tickmarks

  ;-- advance the frame
  frame(wks)

end

Result:

NCL irregular axis labels 1

NCL irregular axis labels 2