[ncl-talk] Panel different sizes plots to equal height
Adam Phillips
asphilli at ucar.edu
Mon May 14 09:25:39 MDT 2018
Hi Tabish,
It would help the community answer your question if you could attach an
image showing your plot.
Thanks,
Adam
On Sun, May 13, 2018 at 4:03 PM, Tabish Ansari <tabishumaransari at gmail.com>
wrote:
> 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
>
> _______________________________________________
> ncl-talk mailing list
> ncl-talk at ucar.edu
> List instructions, subscriber options, unsubscribe:
> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>
>
--
Adam Phillips
Associate Scientist, Climate and Global Dynamics Laboratory, NCAR
www.cgd.ucar.edu/staff/asphilli/ 303-497-1726
<http://www.cgd.ucar.edu/staff/asphilli>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20180514/e6c51935/attachment.html>
More information about the ncl-talk
mailing list