[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