DKRZ NCL - Draw a common labelbar for 4 overlayed plots using 4 rows by 4 columns#
Source code:
;--------------------------------------------------------------------
; DKRZ NCL Example: labelbar_for_reliability_0.25.ncl
;
; Description: Create a labelbar for small data intervalls and
; different reliabilities displayed by increasing
; color brightness.
;--------------------------------------------------------------------
; function add_quad_labelbar
; create a labelbar with 4 lines and 4 columns
;--------------------------------------------------------------------
undef("add_quad_labelbar")
procedure add_quad_labelbar(wks:graphic,plot:graphic,colors:float,levels:numeric,intervals:string,nboxes:numeric,res:logical)
begin
nlevels = dimsizes(levels) ;-- number of levels
labels = ""+levels ;-- convert levels to strings
getvalues plot ;-- retrieve values from given plot
"vpWidthF" : vpw
"vpHeightF" : vph
"vpXF" : xf
"vpYF" : yf
end getvalues
width = vpw - 0.25 ;-- set width
height = 0.02 ;-- set height
dx = (width-0.15)/nboxes ;-- box width
dy = height ;-- box height
ddx = xf ;-- move labelbar to the right
ddy = yf - vph - 0.1 ;-- move labelbar upward
print("dx = "+dx+" dy = "+dy+" width = "+width+" ddx = "+ddx+" ddy = "+ddy)
;-- label bar box offset
offsetx = 0.3 ;-- box offset
offsety = 0.125 ;-- box offset
;-- box definition
boxx = (/0., dx, dx, 0., 0./) ;-- box corners
boxy = (/0., 0., dy, dy, 0./)
;-- polyline resources
plres = True
plres@gsLineColor = "black" ;-- change line color to black
plres@gsLineThicknessF = 2.0 ;-- increase line thickness
;-- polygon resources
pgres = True
pggres = True
;-- label text resources
txres = True
txres@txJust = "CenterRight"
txres@txFontHeightF = 0.009
txresI = txres
txresI@txFontHeightF = 0.010
txresT = True
txresT@txJust = "CenterCenter"
txresT@txFontHeightF = 0.012
;-- loop over number of color boxes
icol = 0
y = 0.
do jl = 0,3
y = jl*height
do il = 0,nboxes-1
x = offsetx +(il*dx)
pgres@gsFillColor = colors(jl,il,:) ;-- change fill color for each box
gsn_polygon_ndc( wks, boxx+x, boxy+ddy-y, pgres) ;-- draw the clear color boxes
gsn_polyline_ndc(wks, boxx+x, boxy+ddy-y, plres) ;-- draw the clear color boxes
end do
gsn_text_ndc(wks,intervals(jl),boxx(0)+offsetx-0.01,boxy(0)+ddy-y+(dy/2),txresI) ;-- draw the labels
end do
;-- draw labels
do i=0,nboxes
x = offsetx +(i*dx)
dc = dx/3
gsn_text_ndc(wks,sprintf("%3.2f",levels(i)),x+(dx/2)-dc,boxy(0)+ddy-(height*4),txres) ;-- draw the labels
end do
;-- draw labelbar annotations
gsn_text_ndc(wks,"reliable", offsetx + dx/2, boxy(0)+ddy+height*2-0.01, txresT) ;-- draw the labels
gsn_text_ndc(wks,"unreliable", offsetx + nboxes*dx - dx/2, boxy(0)+ddy+height*2-0.01,txresT) ;-- draw the labels
gsn_text_ndc(wks,"Reliability",offsetx + (nboxes/2)*dx,boxy(0)+ddy-(height*5)-0.01,txresT) ;-- draw the labels
end
;----------
; MAIN
;----------
begin
;-- open data files and read the variables
diri = "$HOME/NCL/Uncertainty/IPCC/data/"
fili1 = "tas-degC_T2Ms_rcp26_mmm-diff_1x1_mean2081-2099.nc"
vname1 = "tas-degC"
f1 = addfile(diri+fili1,"r")
var = f1->$vname1$(0,:,:)
lat = f1->lat
lon = f1->lon
fili2 = "tas-degC_T2Ms_rcp26_mmm-frac_1x1_mean2081-2099.nc"
vname2 = "tas-degC-frac"
f2 = addfile(diri+fili2,"r")
rel = f2->$vname2$(0,:,:)
rel = lonFlip(rel)
;-- define the variable intervals and levels
intervals = (/"-1.0 < 0.0","0.0 < 1.5","1.5 < 3.0","3.0 < 4.5"/)
levels = fspan(0.0,1.0,5)
;-- select data within values ranges
var0 = where(var .ge. -1.0 .and. var .lt. 0.0, var, var@_FillValue)
var1 = where(var .ge. 0.0 .and. var .lt. 1.5, var, var@_FillValue)
var2 = where(var .ge. 1.5 .and. var .lt. 3.0, var, var@_FillValue)
var3 = where(var .ge. 3.0 .and. var .lt. 4.5, var, var@_FillValue)
var_all = (/var0,var1,var2,var3/)
printVarSummary(var_all)
;-- reliability: convert 2d to 1d array
rel1d = ndtooned(rel)
dims = dimsizes(rel)
;-- reliability: retrieve the indices for value ranges and convert back to 2d
ind0 = ind_resolve(ind(rel1d .ge. 0.00 .and. rel1d .lt. 0.25), dims)
ind1 = ind_resolve(ind(rel1d .ge. 0.25 .and. rel1d .lt. 0.50), dims)
ind2 = ind_resolve(ind(rel1d .ge. 0.50 .and. rel1d .lt. 0.75), dims)
ind3 = ind_resolve(ind(rel1d .ge. 0.75 .and. rel1d .lt. 1.00), dims)
ind4 = ind_resolve(ind(rel1d .ge. 1.00), dims)
;-- set data ranges to values
do i = 0,3
if(.not. any(ismissing(ind0))) then
var_all(i,ind0(0,0),ind0(0,1)) = 0.00
end if
if(.not. any(ismissing(ind1))) then
var_all(i,ind1(0,0),ind1(0,1)) = 0.25
end if
if(.not. any(ismissing(ind2))) then
var_all(i,ind2(0,0),ind2(0,1)) = 0.5
end if
if(.not. any(ismissing(ind3))) then
var_all(i,ind3(0,0),ind3(0,1)) = 0.75
end if
if(.not. any(ismissing(ind4))) then
var_all(i,ind4(0,0),ind4(0,1)) = 1.0
end if
end do
;-- complete variable definition with coordinates
var_all!0 = "interval"
var_all!1 = "lat"
var_all!2 = "lon"
var_all&lat = lat
var_all&lon = lon
var_all&lat@units = "degrees_north"
var_all&lon@units = "degrees_east"
;-- choose color maps, 6 colors
cmapdir = "$HOME/NCL/Colors/"
color1 = read_colormap_file(cmapdir+"Blues_6.rgba")
color2 = read_colormap_file(cmapdir+"Greens_6.rgba")
color3 = read_colormap_file(cmapdir+"GMT_Yellow_6.rgba")
color4 = read_colormap_file(cmapdir+"Reds_6.rgba")
;-- reverse the colormaps and use only 4 colors
cind = (/5,3,1,0/)
color1 := color1(cind,:)
color2 := color2(cind,:)
color3 := color3(cind,:)
color4 := color4(cind,:)
ncol = dimsizes(color1(:,0))
colors = (/color1,color2,color3,color4/)
;-- open workstation
wks_type = "png"
wks_type@wkWidth = 1200
wks_type@wkHeight = 1200
wks = gsn_open_wks(wks_type,"plot_labelbar_reliability_0.25")
;-- set resources
res = True
res@gsnDraw = False
res@gsnFrame = False
res@cnFillOn = True
res@cnFillMode = "RasterFill"
res@cnLinesOn = False
res@cnLineLabelsOn = False
res@cnInfoLabelOn = False
res@cnLevelSelectionMode = "ManualLevels"
res@cnMinLevelValF = 0.0
res@cnMaxLevelValF = 1.0
res@cnLevelSpacingF = 0.2
res@lbLabelBarOn = False ;-- don't draw a labelbar
res@tiMainString = "Reliability Plot"
;-- create the 4 plots for panel overview and 4 plots to be combined (overlay)
res@cnFillPalette := color1
plot0 = gsn_csm_contour_map(wks,var_all(0,:,:),res)
res@tiMainString = "Reliability Plot 0.0 < 0.25"
plot0m = gsn_csm_contour_map(wks,var_all(0,:,:),res)
res@cnFillPalette := color2
plot1 = gsn_csm_contour(wks,var_all(1,:,:),res)
res@tiMainString = "Reliability Plot 0.25 < 0.5"
plot1m = gsn_csm_contour_map(wks,var_all(1,:,:),res)
res@cnFillPalette := color3
plot2 = gsn_csm_contour(wks,var_all(2,:,:),res)
res@tiMainString = "Reliability Plot 0.5 < 0.75"
plot2m = gsn_csm_contour_map(wks,var_all(2,:,:),res)
res@cnFillPalette := color4
plot3 = gsn_csm_contour(wks,var_all(3,:,:),res)
res@tiMainString = "Reliability Plot 0.75 < 1.0"
plot3m = gsn_csm_contour_map(wks,var_all(3,:,:),res)
;-- create panel overview plot
panelres = True
panelres@gsnPanelYWhiteSpacePercent = 10
gsn_panel(wks,(/plot0m,plot1m,plot2m,plot3m/),(/2,2/),panelres)
;-- overlay plots
overlay(plot0,plot1)
overlay(plot0,plot2)
overlay(plot0,plot3)
draw(plot0)
;-- add the multi-line labelbar
add_quad_labelbar(wks,plot0,colors,levels,intervals,ncol,res)
;-- advance the frame
frame(wks)
end
Result: