NCL Website header

Appendices > A | B | C | D


Advanced NCL object example 1

The following example shows how to overlay a ContourPlot object on a MapPlot object. It makes use of a resource file called "example1.res". This example produces a plot identical to frame 4 of example 5.

begin
  data_dir = ncargpath("data") + "/cdf/" ; Get directory path to data.
  cdf_file = addfile(data_dir + "Pstorm.cdf","r") ; Open a netCDF file.

  pf      = cdf_file->p      ; Read pressure values into variable "pf".
  pf@nlon = dimsizes(pf&lon) ; Store lengths of lat/lon arrays as
  pf@nlat = dimsizes(pf&lat) ; attributes of pf.

;
; Create an App object so that a resource file can be used with
; this example (it will look for a resource file named "example1.res"
; since the name of the App object is being called "example1").
; No resources are set in the creation of this object.
;
  appid = create "example1" appClass noparent end create
;
; Create an NcgmWorkstation object. Set resources for specifying
; the name of the metafile and for changing the color map. Remember,
; the color map resource is actually a Workstation class resource, but
; since the NcgmWorkstation class is a subclass of the Workstation class,
; it inherits Workstation's resources.
;
  wks = create "ncgm" ncgmWorkstationClass appid
    "wkMetaName" : "example1.ncgm"
    "wkColorMap" :  (/(/1.00, 1.00, 1.00/), (/0.00, 0.00, 0.00/), \
                      (/0.56, 0.50, 0.70/), (/0.30, 0.30, 0.70/), \
                      (/0.10, 0.10, 0.70/), (/0.00, 0.10, 0.70/), \
                      (/0.00, 0.30, 0.70/), (/0.00, 0.50, 0.50/), \
                      (/0.00, 0.40, 0.20/), (/0.00, 0.60, 0.00/), \
                      (/0.00, 1.00, 0.00/), (/0.55, 0.55, 0.00/), \
                      (/0.57, 0.42, 0.00/), (/0.70, 0.29, 0.00/), \
                      (/0.70, 0.18, 0.00/), (/0.87, 0.05, 0.00/), \
                      (/1.00, 0.00, 0.00/), (/0.00, 1.00, 1.00/), \
                      (/0.70, 0.70, 0.70/)/)
  end create

;
; Create a DataItem object for the ContourPlot object being created later.
;
  dataid = create "data" scalarFieldClass appid
    "sfDataArray" : pf(1,:,:)*0.01  ; Convert pressure to millibars.
    "sfXCStartV"  : min(pf&lon)     ; Define start and end values of
    "sfXCEndV"    : max(pf&lon)     ; X and Y axis in lat/lon coords,
    "sfYCStartV"  : min(pf&lat)     ; since this data field will be
    "sfYCEndV"    : max(pf&lat)     ; contoured and overlaid on a map.
  end create
    
;
; Create a MapPlot object. Set several MapPlot resources for changing
; the map projection, for zooming in on a part of the map, for filling
; certain map areas and masking others, and for drawing the lat/lon
; grid over the ocean.
;
; Also set some View resources for increasing the size of the plot 
; (View resources can be set when a MapPlot is created because the
; MapPlot class is a child of the View class, and thus inherits all
; of its resources).
;
; The rest of the MapPlot resources are being set in the "example1.res"
; resource file.
;
  map = create "mapplot" mapPlotClass wks
    "mpProjection" : "LambertEqualArea"  ; Change the map projection.
    "mpCenterLonF" : (pf&lon(pf@nlon-1) + pf&lon(0))/2
    "mpCenterLatF" : (pf&lat(pf@nlat-1) + pf&lat(0))/2

    "mpLimitMode"  : "LatLon"    ; Limit the map view.
    "mpMinLonF"    : min(pf&lon)
    "mpMaxLonF"    : max(pf&lon)
    "mpMinLatF"    : min(pf&lat)
    "mpMaxLatF"    : max(pf&lat)

    "vpXF"      : 0.1  ; Set some View resources to change the size
    "vpYF"      : 0.9  ; and location of the  plot on the viewport.
    "vpWidthF"  : 0.7
    "vpHeightF" : 0.7
  end create    

;
; Create a ContourPlot object.  Turn on the drawing of a label bar
; and add a title.
;
; Many of the ContourPlot resources are being set in the "example1.res"
; resource file.
;
  contour = create "contourplot" contourPlotClass wks
    "cnScalarFieldData"     : dataid     ; Reference data object created.

    "cnLevelSelectionMode"  : "ExplicitLevels" ; Define own contour levels.
    "cnLevels"              : fspan(985.,1045.,13)

    "tiMainString"          : ":F26:January 1996 storm" ; Main title
    "lbTitleString"         : ":F25:pressure (mb)"      ; Label bar title
  end create

;
; Overlay the ContourPlot object on MapPlot object. The MapPlot becomes
; the "base plot" and contains the overlay plot (the ContourPlot), so if
; you draw the MapPlot, the ContourPlot will get drawn as well.
;
  overlay(map,contour)

  draw(map)              ; Draw the base plot (the MapPlot object).
  frame(wks)             ; Advance the frame.
end
The resource file "example1.res":
!
! Set some MapPlot resources.
!
*mpPerimOn             : True
*mpFillOn              : True
*mpFillAreaSpecifiers  : (/Water,Land,USStatesWater/)
*mpSpecifiedFillColors : (/17,18,17/)

*mpAreaMaskingOn       : True
*mpMaskAreaSpecifiers  : USStatesLand
*mpPerimOn             : True
*mpGridMaskMode        : MaskLand

! 
! Set some contour resources.
!
*cnFillOn              : True
*cnLineLabelsOn        : False
*cnInfoLabelOn         : False
*cnLinesOn             : False
*cnFillDrawOrder       : Predraw

!
! Turn on the drawing of a label bar with the contour plot only.
!
*contourplot.pmLabelBarDisplayMode : Always
*contourplot.pmLabelBarSide        : Bottom

!
! Set some label bar resources.
!
*lbOrientation                     : Horizontal
*lbPerimOn                         : False


Advanced NCL object example 2

The following example shows how to overlay a VectorPlot object on a ContourPlot object on a MapPlot object. It does not use a resource file, so no App object is created. It sends the output to a PostScript file, with the plot rotated 90 degrees clockwise and filling up most of an 8-1/2" x 11" page.

begin
  dir = ncargpath("data")
  uf = addfile(dir+"/cdf/Ustorm.cdf","r")  ; Open three netCDF files.
  vf = addfile(dir+"/cdf/Vstorm.cdf","r")
  pf = addfile(dir+"/cdf/Pstorm.cdf","r")

;
; Create a PSWorkstation object. Change the background to white
; and the foreground to black. Rotate the plot 90 degrees and 
; reposition it to fill up most of an 8-1/2" x 11" page.
;
  pswks = create "ps" psWorkstationClass defaultapp
    "wkForegroundColor" : (/0.,0.,0./)  ; Set foreground to black.
    "wkBackgroundColor" : (/1.,1.,1./)  ; Set background to white.

    "wkOrientation"     : "Landscape"   ; Landscape mode

    "wkDeviceLowerX"    : -90  ; Specify the position of the plot in PS
    "wkDeviceLowerY"    : -15  ; coordinate space (see the section
    "wkDeviceUpperX"    : 710  ; "Positioning PS output on the page" in
    "wkDeviceUpperY"    : 785  ; the GKS User Guide).
  end create

  MinLat =   18.  ; Set min and max values for
  MaxLat =   65.  ; part of map to zoom in on.
  MinLon = -140.
  MaxLon =  -58.

; 
; Create ScalarField object (to provide data for the ContourPlot object).
;
  sfdataid = create "scalarfield" scalarFieldClass defaultapp
    "sfDataArray"     : pf->p(0,:,:)*0.01   ; Convert pf to millibars.
    "sfXCEndV"        : pf->lon(dimsizes(pf->lon) - 1)
    "sfXCStartV"      : pf->lon(0)
    "sfYCEndV"        : pf->lat(dimsizes(pf->lat) - 1)
    "sfYCStartV"      : pf->lat(0)
    "sfMissingValueV" : -9999.0
  end create

;
; Create VectorField object (to provide data for the VectorPlot object).
;
  vfdataid = create "vectorfield" vectorFieldClass defaultapp
    "vfUDataArray" : uf->u(0,:,:)
    "vfVDataArray" : vf->v(0,:,:)
    "vfXCEndV"     : uf->lon(dimsizes(uf->lon) - 1)
    "vfXCStartV"   : uf->lon(0)
    "vfYCEndV"     : uf->lat(dimsizes(uf->lat) - 1)
    "vfYCStartV"   : uf->lat(0)
    "vfMissingUValueV" : -9999.0
  end create

;
; Create MapPlot object.
;
  mapid = create "mapplot" mapPlotClass pswks
    "mpLimitMode"   : "LatLon" ; Define portion of map to zoom in on.
    "mpMaxLatF"     : MaxLat
    "mpMaxLonF"     : MaxLon
    "mpMinLatF"     : MinLat
    "mpMinLonF"     : MinLon
 
    "mpPerimOn"       : True    ; Turn on map perimeter.
    "mpGridAndLimbOn" : False   ; Turn off lat/lon grid lines.

    "vpXF"      : 0.1    ; Increase size of and reposition plot
    "vpYF"      : 0.9    ; in the viewport.
    "vpWidthF"  : 0.8
    "vpHeightF" : 0.8
  end create

; 
; Create ContourPlot object.
;
  cnid = create "contourplot" contourPlotClass pswks
    "cnScalarFieldData" : sfdataid
  end create

;
; Create VectorPlot object.
;
  vcid = create "vectorplot" vectorPlotClass pswks
    "vcVectorFieldData" : vfdataid
  end create

; 
; Overlay ContourPlot object on MapPlot object.
;
  overlay(mapid,cnid)

; 
; Overlay VectorPlot object on MapPlot object (which contains the
; ContourPlot at this point).
;
  overlay(mapid,vcid)

;
; Draw MapPlot object. Since it is the base plot, both the
; ContourPlot and VectorPlot also get drawn.
;
  draw(mapid)

  frame(pswks)      ; Advance the frame.

  delete(pswks)     ; Clean up (not necessary, but highly recommended).
  delete(sfdataid)
  delete(vfdataid)
end
The above example produces the following plot:

(Click on image to see it enlarged.)