[ncl-talk] Panel different sizes plots to equal height
Tabish Ansari
tabishumaransari at gmail.com
Sun May 13 16:03:35 MDT 2018
Hi
I am trying to panel my WRF domains: domain1 and domain3 which have very
different aspect ratios and sizes. Currently using the following script I'm
able to panel them together but not change their size. I tried using vp
resources but without success. Can you please let me know what changes I
make to this script to make the D03 same in height as D01 without changing
aspect ratios?
Here's the script:
; PANELPLOT OF WRF-CHEM D01 AND D03 PM2.5 CONCENTRATIONS CONTOUR MAPS ALONG
WITH OBSERVATIONS
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"
;----------------------------------------------------------------------
; Procedure to attach colored markers to an NCL map, given 1D
; data, and lat/lon arrays, a set of levels, and a color map.
;----------------------------------------------------------------------
procedure
add_obs_markers_to_map(wks,plot,levels,colormap,data_1d,lat_1d,lon_1d)
local mkres, nlevels, colors, nlevels, n, ii
begin
;---Set resources for the markers
mkres = True
mkres at gsMarkerIndex = 16
mkres at gsMarkerSizeF = 0.0035
; Based on the levels we had for the contour plot and the colormap used,
; get an array of colors that span the colormap. This uses the same
; algorithm that the contour used, so the colors will be identical.
;
nlevels = dimsizes(levels)
colors = span_color_rgba(colormap,nlevels+1) ; Need one more color than
number of levels
;
; Loop through each level, gather all the data values in the given level
; range, and add colored markers to the existing map.
;
do n=0,nlevels
;---These "if" statements are how color contours are handled in NCL.
if(n.eq.0) then
ii := ind(data_1d.lt.levels(n))
else if(n.eq.nlevels) then
ii := ind(data_1d.ge.levels(n-1))
else
ii := ind(data_1d.ge.levels(n-1).and.data_1d.lt.levels(n))
end if
end if
if(any(ismissing(ii))) then
continue
end if
;---Add the markers
mkres at gsMarkerColor = colors(n,:) ; colors is an N x 4 array
plot@$unique_string("markers")$ =
gsn_add_polymarker(wks,plot,lon_1d(ii),lat_1d(ii),mkres)
end do
end
;----------------------------------------------------------------------
; Main code
;----------------------------------------------------------------------
begin
;---Open WRF output file and read data
DATADir = "/data2/tabish/control-run-so4-ECMWF/"
FILES = systemfunc (" ls -1 " + DATADir + "wrfout_d01_2014-10* ")
numFILES = dimsizes(FILES)
s=1
a = addfile(FILES(0)+".nc","r"); THIS IS JUST FOR INITIALIZATION OF PM25
ARRAY, IT WILL BE SUBSTRACTED FROM THE SUM IN THE END
pm25init = a->PM2_5_DRY(15,0,:,:)
pm25sum = pm25init
times = wrf_user_getvar(a,"times",-1) ; get all times in the file
ntimes = dimsizes(times)
do it = 16,ntimes-1,1 ; TIME LOOP
s=s+1
print("Working on time: " + times(it) )
pm25sum = pm25sum + a->PM2_5_DRY(it,0,:,:)
end do ; END OF TIME LOOP
do ifil = 1,numFILES-2 ; FILE LOOP
a = addfile(FILES(ifil)+".nc","r") ; Open the next file
times = wrf_user_getvar(a,"times",-1) ; get all times in the file
ntimes = dimsizes(times)
do it = 0,ntimes-1,1 ; TIME LOOP
s=s+1
print("Working on time: " + times(it) )
pm25sum = pm25sum + a->PM2_5_DRY(it,0,:,:)
end do ; END OF TIME LOOP
end do
a = addfile(FILES(numFILES-1)+".nc","r") ; Open the next file
times = wrf_user_getvar(a,"times",-1) ; get all times in the file
ntimes = dimsizes(times)
do it = 0,16,1 ; TIME LOOP
s=s+1
print("Working on time: " + times(it) )
pm25sum = pm25sum + a->PM2_5_DRY(it,0,:,:)
end do ; END OF TIME LOOP
pm25_avg= pm25sum/s
pm25_avg at description = "PM2.5 conc in ug/m3"
lat2d = wrf_user_getvar(a,"XLAT",it) ; latitude/longitude
lon2d = wrf_user_getvar(a,"XLONG",it)
pm25_avg at lat2d = lat2d ; for plotting
pm25_avg at lon2d = lon2d
;---Will use this for contours and filled markers
colormap = "BlAqGrYeOrReVi200"
;levels = ispan(0,180,9)
levels =
(/0,2,5,10,15,20,25,30,35,40,45,50,55,60,65,70,80,90,100,110,160,200/)
wks = gsn_open_wks("x11","wrf_obs_d01-d03_pm25")
;---Common resources shared by both contour plot and marker plot
res = True
res at gsnMaximize = True
res at gsnLeftString = ""
res at gsnRightString = ""
res at mpDataBaseVersion = "MediumRes"
; res at mpFillOn = False
; res at mpMinLatF = min(pm25_avg at lat2d)
; res at mpMaxLatF = max(pm25_avg at lat2d)
; res at mpMinLonF = min(pm25_avg at lon2d)
; res at mpMaxLonF = max(pm25_avg at lon2d)
; res at pmTickMarkDisplayMode = "Always" ; better map tickmarks
res at mpLimitMode = "Corners" ; choose range of map
res at mpLeftCornerLatF = 51.8
res at mpLeftCornerLonF = 82.6
res at mpRightCornerLatF = 22.66
res at mpRightCornerLonF = 130.499
res at mpProjection = "LambertConformal"
res at mpLambertParallel1F = 20
res at mpLambertParallel2F = 50
res at mpLambertMeridianF = 110
;---Resources for filled contour plot
cnres = res
cnres at cnFillOn = True
cnres at cnLevelSelectionMode = "ExplicitLevels"
cnres at cnLevels = levels
cnres at cnFillPalette = colormap
cnres at cnLinesOn = False
cnres at cnLineLabelsOn = False
cnres at lbLabelBarOn = False ; will add in panel later
cnres at pmTitleZone = 2 ; move title down
cnres at gsnAddCyclic = False
cnres at mpLimitMode = "Corners" ; choose range of map
cnres at mpLeftCornerLatF = 51.8
cnres at mpLeftCornerLonF = 82.6
cnres at mpRightCornerLatF = 22.66
cnres at mpRightCornerLonF = 130.499
cnres at mpProjection = "LambertConformal"
cnres at mpLambertParallel1F = 20
cnres at mpLambertParallel2F = 50
cnres at mpLambertMeridianF = 110
cnres at mpFillOn = True
cnres at mpOutlineDrawOrder = "PostDraw"
cnres at mpFillDrawOrder = "PreDraw"
; cnres at mpOutlineBoundarySets = "National"
cnres at mpOutlineBoundarySets = "Allboundaries"
cnres at mpUSStateLineDashPattern = 2
cnres at mpOutlineOn = True
cnres at mpDataBaseVersion = "MediumRes"
cnres at mpDataSetName = "Earth..4" ; U.S. counties
;cnres at mpGridAndLimbOn = True
;cnres at mpGridLineColor = "Grey"
cnres at mpFillColors = (/"transparent","transparent","gray","transparent"/)
cnres at pmTickMarkDisplayMode = "Always"
cnres at tiMainString = "Domain 1 @ 27km"
cnres at tiDeltaF = 3.3
cnres at tfDoNDCOverlay = True
cnres at gsnDraw = False ; don't draw
cnres at gsnFrame = False ; don't advance frame
; cnres at vpWidthF = 0.40
cnres at vpHeightF = 0.20
;---Create smooth contour plot
plot_wrf_d01 = gsn_csm_contour_map(wks,pm25_avg,cnres)
delete(pm25init)
delete(pm25sum)
delete(pm25_avg)
delete(s)
delete(lat2d)
delete(lon2d)
;----------------------------------------------------------------------
; Recreate similar plot, but by using filled markers drawn over a map.
;----------------------------------------------------------------------
fname = "surfacedata_12-31_Octmean_improved_nomissingval.txt"
lines = asciiread(fname,-1,"string")
lon = tofloat(str_get_field(lines(:),2," "))
lat = tofloat(str_get_field(lines(:),3," "))
pm25 = tofloat(str_get_field(lines(:),4," "))
;*****************************************
; add black circles over obs data
;*****************************************
polyres = True ; poly marker mods desired
polyres at gsMarkerIndex = 4 ; choose circle as polymarker
polyres at gsMarkerSizeF = 5 ; select size to avoid streaking
polyres at gsMarkerColor = (/"black"/) ; choose color
polyres at gsMarkerThicknessF = 2.0
tabish1=gsn_add_polymarker(wks,plot_wrf_d01,lon,lat,polyres) ; draw
polymarkers
;---Add colored markers to the map
add_obs_markers_to_map(wks,plot_wrf_d01,levels,colormap,pm25,lat,lon)
; draw(plot_wrf)
; frame(wks)
;***********************************************
; NOW REPEATING THE SAME ROUTINE FOR D03
;***********************************************
DATADir = "/data2/tabish/control-run-so4-ECMWF/"
FILES = systemfunc (" ls -1 " + DATADir + "wrfout_d03_2014-10* ")
numFILES = dimsizes(FILES)
s=1
a = addfile(FILES(0)+".nc","r"); THIS IS JUST FOR INITIALIZATION OF PM25
ARRAY, IT WILL BE SUBSTRACTED FROM THE SUM IN THE END
pm25init = a->PM2_5_DRY(15,0,:,:)
pm25sum = pm25init
times = wrf_user_getvar(a,"times",-1) ; get all times in the file
ntimes = dimsizes(times)
do it = 16,ntimes-1,1 ; TIME LOOP
s=s+1
print("Working on time: " + times(it) )
pm25sum = pm25sum + a->PM2_5_DRY(it,0,:,:)
end do ; END OF TIME LOOP
do ifil = 1,numFILES-2 ; FILE LOOP
a = addfile(FILES(ifil)+".nc","r") ; Open the next file
times = wrf_user_getvar(a,"times",-1) ; get all times in the file
ntimes = dimsizes(times)
do it = 0,ntimes-1,1 ; TIME LOOP
s=s+1
print("Working on time: " + times(it) )
pm25sum = pm25sum + a->PM2_5_DRY(it,0,:,:)
end do ; END OF TIME LOOP
end do
pm25_avg= pm25sum/s
;pm25_avg at description = "NO2 conc in ppbv"
lat2d = wrf_user_getvar(a,"XLAT",it) ; latitude/longitude
lon2d = wrf_user_getvar(a,"XLONG",it)
pm25_avg at lat2d = lat2d ; for plotting
pm25_avg at lon2d = lon2d
res at mpLimitMode = "Corners" ; choose range of map
res at mpLeftCornerLatF = 36.05806
res at mpLeftCornerLonF = 113.3356
res at mpRightCornerLatF = 42.4514
res at mpRightCornerLonF = 120.2583
cnres at mpLimitMode = "Corners" ; choose range of map
cnres at mpLeftCornerLatF = 36.05806
cnres at mpLeftCornerLonF = 113.3356
cnres at mpRightCornerLatF = 42.4514
cnres at mpRightCornerLonF = 120.2583
cnres at tiMainString = "Domain 3 @ 3km"
cnres at vpKeepAspect = True
cnres at vpHeightF = 0.20
;---Create smooth contour plot
plot_wrf_d03 = gsn_csm_contour_map(wks,pm25_avg,cnres)
;*****************************************
; add black circles over obs data
;*****************************************
polyres = True ; poly marker mods desired
polyres at gsMarkerIndex = 4 ; choose circle as polymarker
polyres at gsMarkerSizeF = 5 ; select size to avoid streaking
polyres at gsMarkerColor = (/"black"/) ; choose color
polyres at gsMarkerThicknessF = 2.0
tabish3=gsn_add_polymarker(wks,plot_wrf_d03,lon,lat,polyres) ; draw
polymarkers
;---Add colored markers to the map
add_obs_markers_to_map(wks,plot_wrf_d03,levels,colormap,pm25,lat,lon)
;---Panel both plots for comparison.
pres = True
pres at gsnMaximize = True
pres at gsnPanelLabelBar = True
pres at pmLabelBarWidthF = 0.8
pres at lbLabelFontHeightF = 0.01
pres at gsnFrame = False
pres at gsnPanelBottom = 0.05 ; add space at bottom
gsn_panel(wks,(/plot_wrf_d01,plot_wrf_d03/),(/1,2/),pres)
; Draw a text string at the bottom
txres = True
txres at txFontHeightF = 0.012
gsn_text_ndc(wks,"PM2.5 in ug/m3",0.5,0.28,txres)
frame(wks)
; Maximize plots in frame.
; psres = True
; maximize_output(wks,psres) ; calls draw and frame for you
end
Your help will be greatly appreciated.
Thanks
Tabish
Tabish U Ansari
PhD student, Lancaster Environment Center
Lancaster Univeristy
Bailrigg, Lancaster,
LA1 4YW, United Kingdom
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20180513/58b432f3/attachment.html>
More information about the ncl-talk
mailing list