Re: question about plotting typhoon best track

From: Dennis Shea <shea_at_nyahnyahspammersnyahnyah>
Date: Wed Nov 25 2009 - 06:56:25 MST

If you print the lat0/lon0, lat12/lon12/day12
you would see they have the _FillValue. NCL will terminate
the line drawing.

Try the attached script. It use the "ind" function to extract
a continuous set of locations.

http://www.ncl.ucar.edu/Document/Functions/Built-in/ind.shtml

Good Luck

Li Richard wrote:
> Hi everyone,
> Thanks Jonathan and Dennis for their scripts. I have tried my best to
> modify the scripts to create the best track plot. However, since I am a
> new ncl user, I'm not sure whether I've made any mistakes. In my plot,
> some portions of the track line is missing (see the attachment)
> and I don't know why. So could anyone help me to check my code to see if
> I have made any mistake? The data I used and the output plot can be
> found in the attachment. Thank you.
> Best regards,
> Richard
> ;********************************************************
> ; track_one.ncl
> ;
> ; Author: Jonathan Vigh (with assistance from Mary Haley)
> ; Location: Colorado State University
> ;
> ;
> ; The purpose of this script is to plot the best track
> ; for jut one storm including all data (subtropical
> ; storms, depressions, extrtropical lows, etc.)
> ;
> ; For future work - fix up annotations with new NCL annotation
> functionality.
> ; ALSO, see about controlling the lat/lon tickmark spacing using
> ; a resource like gsnMajorLatSpacing.
> ;
> ;********************************************************
> 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/csm/shea_util.ncl"
> begin
> diri = "C:/Documents and Settings/richard li/桌面/typhoon best track
> data/2007-wp-full/"
> fili = "bwp122007.txt"
>
> cyclone_name = "Mitch"
> ssn = "13"
> ; Next, set the plotting parameters (which cases to plot)
> TypeOn = True ; If you just want the legend to
> have the basic (H, TS, and TD) designators (* and S), set TypeOn to False
> ; NOTE -- this will cause the program to grab a
> different input file -- one in which all the
> ; extratropical (E), remnant low (L), and wave
> cases (W) have been taken out; additionally,
> ; there will not be a distinction between the S
> and * cases (they will just be plotted according to
> ; intensity
> PlotSubTropicalSegments = True ; If you wish to exclude all
> subtropical line segments, set to False
>
> ; Note: if TypeOn is set to False, the following (W, L, E) cases won't
> be plotted regardless of their value
> PlotWaveSegments = True ; If you wish to exclude all wave
> segments, set to False
> PlotLowSegments = True ; If you wish to exclude all remnant
> low segments, set to False
> PlotExtraTropicalSegments = True ; If you wish to exclude all
> extratropical line sements, set to False
>
>
> ;********************************
> ; get data
> ;********************************
> data = asciiread(diri+fili, -1,"string") ; Info includes type so
> cases can be weeded out
> ;tStr = asciiread(fili, -1,"string") ; Info includes type so cases
> can be weeded out
> tChr = stringtochar(data)
>
> nrows = dimsizes(data)
>
> region = str_get_cols( data, 0, 1)
> print(region)
> year = str_get_cols( data, 8, 11)
> month = str_get_cols( data, 12, 13)
> day = str_get_cols( data, 14, 15)
> hour = str_get_cols( data, 16, 17)
> vmax = str_get_cols( data, 48, 50)
> print (vmax)
> lat = stringtofloat(str_get_cols( data, 35, 37))*0.1
> ;if (str_get_cols( data, 38, 38).eq."S") then
> ; lat = -lat
> ;end if
> print(lat)
> lon = stringtofloat(str_get_cols( data, 41, 44))*0.1
> ;if (str_get_cols( data, 45, 45).eq."W") then
> ; lon = -lon
> ;end if
> print(lon)
> type = str_get_cols( data, 59, 60) ; "DB", "TD"
> name = str_get_cols( data,149,158)
> print(type+" "+name)
> ; Now create arrays that only hold the points for the 00z locations
> lat0 = mask(lat,hour,0)
> lon0 = mask(lon,hour,0)
>
> lat12 = mask(lat,hour,12)
> lon12 = mask(lon,hour,12)
> day12 = mask(day,hour,12)
>
>
> ;sn = stringtoint( chartostring(tChr(:,0:1)) )
> ;year = stringtoint( chartostring(tChr(:,2:3)) )
> ;month = stringtoint( chartostring(tChr(:,4:5)) )
> ;day = stringtoint( chartostring(tChr(:,6:7)) )
> ;hour = stringtoint( chartostring(tChr(:,8:9)) )
>
> ;lat = stringtofloat( chartostring(tChr(:,10:13)) )/10..0
> ;lon = -stringtofloat( chartostring(tChr(:,15:18)) )/10.0
> ;vmax = stringtoint( chartostring(tChr(:,21:23)) )
>
> ;type = chartostring(tChr(:,30:30))
>
> ;********************************
> ; select sub-regions
> ;********************************
> minlat = 5.0 ;min(lat) ; 0.0 ; deg N ; was 0
> maxlat = 40.0 ;max(lat) ; 57.0 ; deg N ; was 57
> minlon = 100.0 ; min(lon) -.;-100.0 ; - deg E = deg W ; was -100
> maxlon = 145.0 ; max(lon) +10.; -10.0 ; - deg E = deg W ;
> was -20, then -15
> ;***** Define some NICE color maps to use.
> colors_8 =
> (/"White","Black","Black","MediumPurple1","MediumPurple3","Blue1",\
> "CadetBlue3","Aquamarine2", \
> "Gold","Tan1","Sienna1","Tomato","VioletRed1", \
> "Yellow","LimeGreen","Grey37","Red","Orange","GoldenRod1", \
> "DarkOrange","SteelBlue1","SlateBlue1","SlateGray1", \
> "LightSlateBlue","Magenta","DodgerBlue", \
> "LightSteelBlue1","Moccasin","LightYellow","LemonChiffon1", \
> "CornSilk","LightGoldenrodYellow","Tan","PaleTurquoise3"/)
>
> ;********************************
> ; create plot
> ;********************************
> wks = gsn_open_wks("x11",cyclone_name)
> gsn_define_colormap(wks,colors_8)
>
> res = True
> ; res@gsnMaximize <mailto:res@gsnMaximize> = True
> res@gsnDraw <mailto:res@gsnDraw> = False ; so we can add
> poly stuff
> res@gsnFrame <mailto:res@gsnFrame> = False ; do not advance
> frame
> res@gsnMaximize <mailto:res@gsnMaximize> = True
> ; res@gsnPaperOrientation <mailto:res@gsnPaperOrientation> = "portrait"
> res@mpDataBaseVersion <mailto:res@mpDataBaseVersion> = "Ncarg4_1"
> ; Alias 'MediumRes'
> res@mpDataSetName <mailto:res@mpDataSetName> = "Earth..1"
> ; res@mpProjection <mailto:res@mpProjection> = "LambertConformal"
>
> res@mpLambertParallel1F <mailto:res@mpLambertParallel1F> = 20.0
> res@mpLambertParallel2F <mailto:res@mpLambertParallel2F> = 40.0
> res@mpLambertMeridianF <mailto:res@mpLambertMeridianF> = -60.0
>
> res@mpLimitMode <mailto:res@mpLimitMode> = "LatLon"
> res@mpMinLatF <mailto:res@mpMinLatF> = minlat
> res@mpMaxLatF <mailto:res@mpMaxLatF> = maxlat
> res@mpMinLonF <mailto:res@mpMinLonF> = minlon
> res@mpMaxLonF <mailto:res@mpMaxLonF> = maxlon
>
> res@mpFillOn <mailto:res@mpFillOn> = True ; False to turn
> off gray continents
> res@mpOutlineOn <mailto:res@mpOutlineOn> = True ; turn on
> continental outline
> res@mpOutlineBoundarySets <mailto:res@mpOutlineBoundarySets> =
> "AllBoundaries"
> res@mpLandFillColor <mailto:res@mpLandFillColor> = "Tan" ;
> was "GoldenRod1"
> res@mpInlandWaterFillColor <mailto:res@mpInlandWaterFillColor> =
> "PaleTurquoise3" ; was "LightBlue1" ; was "PaleTurquoise3"
> res@mpOceanFillColor <mailto:res@mpOceanFillColor> =
> "PaleTurquoise3" ; was "LightBlue1"
> res@mpGeophysicalLineColor <mailto:res@mpGeophysicalLineColor> =
> "Grey37"
> res@mpGeophysicalLineThicknessF
> <mailto:res@mpGeophysicalLineThicknessF> = 0.5
>
> res@mpUSStateLineColor <mailto:res@mpUSStateLineColor> =
> "Grey37"
> res@mpUSStateLineThicknessF <mailto:res@mpUSStateLineThicknessF>
> = 0.5
>
> res@mpNationalLineColor <mailto:res@mpNationalLineColor> =
> "Grey37"
> res@mpNationalLineThicknessF <mailto:res@mpNationalLineThicknessF>
> = 0.5
>
> res@mpGridAndLimbOn <mailto:res@mpGridAndLimbOn> = "True"
> res@mpGridAndLimbDrawOrder <mailto:res@mpGridAndLimbDrawOrder> = "Draw"
> res@mpGridMaskMode <mailto:res@mpGridMaskMode> = "MaskLand"
> res@mpGridSpacingF <mailto:res@mpGridSpacingF> = 5.0
> res@mpGridLineColor <mailto:res@mpGridLineColor> = "Grey37"
> res@tmXBLabelFontHeightF <mailto:res@tmXBLabelFontHeightF> = 0.012
> ; 0.005
> res@tmXBMajorLengthF <mailto:res@tmXBMajorLengthF> = -0.001
> res@pmTickMarkDisplayMode <mailto:res@pmTickMarkDisplayMode> = "Always"
>
> ; res@tiMainString <mailto:res@tiMainString> = "Hurricane Wilma (2005)"
>
> ;***************************************
> ; plot base map *
> ;***************************************
> plot = gsn_csm_map(wks,res) ; draw one of eight map projections
>
> ;***************************************
> ; Draw best track history as polylines *
> ;***************************************
> res_poly = True ; polyline mods desired
> ; create array of dummy graphic variables. This is required, b/c each line
> ; must be associated with a unique dummy variable.
> dum = new(dimsizes(hour),graphic)
> ic = 0
> do k=0,nrows-2
> if(.not.ismissing(lat(k)))
> res_poly@gsLineDashPattern <mailto:res_poly@gsLineDashPattern> = 0
> res_poly@gsLineThicknessF
> <mailto:res_poly@gsLineThicknessF> = 4
> if(.not. TypeOn) then
> ; Plot hurricane segments
> if((vmax(k).gt.64).and.(type(k).eq."*")) then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "Red"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> ; Plot tropical storm segments
> if((vmax(k).lt.64).and.(vmax(k).gt.34).and.(type(k).eq."*")) then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "Yellow"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> ; Plot tropical depression segments
> if((vmax(k).lt.34).and.(type(k).eq."*")) then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "LimeGreen"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> ; Now plot the subtropical segments with dashed lines
> ; Plot hurricane segments of subtropical systems with dashed red lines
> if((vmax(k).gt.64).and.(type(k).eq."S")) then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "Red"
> res_poly@gsLineDashPattern
> <mailto:res_poly@gsLineDashPattern> = 2
> res_poly@gsLineDashSegLenF
> <mailto:res_poly@gsLineDashSegLenF> = 0.1
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> ; Plot tropical storm segments of subtropical systems with dashed yellow
> lines
> if((vmax(k).lt.64).and.(vmax(k).gt.34).and.(type(k).eq."S")) then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "Yellow"
> res_poly@gsLineDashPattern
> <mailto:res_poly@gsLineDashPattern> = 2
> res_poly@gsLineDashSegLenF
> <mailto:res_poly@gsLineDashSegLenF> = 0.1
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> ; Plot tropical depression segments of subtropical systems with dashed
> dark LimeGreen lines
> if((vmax(k).lt.34).and.(type(k).eq."S")) then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "LimeGreen"
> res_poly@gsLineDashPattern
> <mailto:res_poly@gsLineDashPattern> = 2
> res_poly@gsLineDashSegLenF
> <mailto:res_poly@gsLineDashSegLenF> = 0.1
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> else ; if(TypeOn) -- plot pure tropical segments as solid lines (red
> for hurricane, etc.).
> ; Plot hurricane segments
> if((vmax(k).gt.64).and.(type(k).eq."TY")) then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "Red"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> ; Plot tropical storm segments
> if((vmax(k).lt.64).and.(type(k).eq."TS").and.(vmax(k).gt.34))
> then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "Yellow"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> ; Plot tropical depression segments
> if((vmax(k).lt.34).and.(type(k).eq."TD")) then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "LimeGreen"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
>
> ; Plot tropical disturbance segments
> if((type(k).eq."DB").and.(vmax(k).lt.34)) then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "Purple"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> if(PlotWaveSegments) then
> ; Plot tropical wave segments
> if(type(k).eq."WV") then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "LimeGreen"
> res_poly@gsLineDashPattern
> <mailto:res_poly@gsLineDashPattern> = 2
> res_poly@gsLineDashSegLenF
> <mailto:res_poly@gsLineDashSegLenF> = 0.1
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> end if
>
> if(PlotLowSegments) then
> ; Plot remanant low segments
> if(type(k).eq."LO") then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "SlateBlue"
> res_poly@gsLineDashPattern
> <mailto:res_poly@gsLineDashPattern> = 2
> res_poly@gsLineDashSegLenF
> <mailto:res_poly@gsLineDashSegLenF> = 0.1
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> end if
>
> if(PlotSubTropicalSegments) then
>
> ; Plot subtropical storm segments
> if((vmax(k).gt.34).and.(type(k).eq."SS")) then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "DarkOrange"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> ; Plot subtropical depression segments
> if((vmax(k).lt.34).and.(type(k).eq."SD")) then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor>
> = "Blue1"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> end if
>
> if(PlotExtraTropicalSegments) then
> ; Plot extratropical segments
> if(type(k).eq."EX") then
> res_poly@gsLineColor <mailto:res_poly@gsLineColor> =
> "Black"
> res_poly@gsLineDashPattern <mailto:res_poly@gsLineDashPattern> = 2
> res_poly@gsLineDashSegLenF <mailto:res_poly@gsLineDashSegLenF> = 0.1
> dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> end if
> end if
>
> end if
> end do
>
> ;***************************************
> ; Draw black dots at lat/lon itersections
> ;***************************************
>
> ;***************************************
> ; Draw black polymarkers at 00Z locations
> ;***************************************
> res_mark = True
> res_mark@gsMarkerIndex <mailto:res_mark@gsMarkerIndex> = 1 ;
> polymarker style
> res_mark@gsMarkerSizeF <mailto:res_mark@gsMarkerSizeF> = 0.02 ;
> polymarker size - was 0.012
> res_mark@gsMarkerColor <mailto:res_mark@gsMarkerColor> = "Black" ;
> change marker color
> duma = new(1,graphic)
> duma = gsn_add_polymarker(wks,plot,lon0,lat0,res_mark)
>
> ; Now draw white polymarkers at 12z locations
> res_mark@gsMarkerIndex <mailto:res_mark@gsMarkerIndex> = 1
> res_mark@gsMarkerSizeF <mailto:res_mark@gsMarkerSizeF> = 0.02 ;
> polymarker size - was 0.012
> res_mark@gsMarkerColor <mailto:res_mark@gsMarkerColor> = "White" ;
> change marker color
>
>
> dumb = new(1,graphic)
> dumb = gsn_add_polymarker(wks,plot,lon12,lat12,res_mark)
>
> ;***************************
> ; Plot some text labels *
> ;***************************
> txres = True
> ; Now draw the day labels at each 00Z marker
> txres@txFontHeightF <mailto:txres@txFontHeightF> = 0.015 ; 0.008
> txres@txJust <mailto:txres@txJust> = "TopCenter"
>
> dumz = new(nrows,graphic)
>
> do k=0,nrows-1
> dumz(k) = gsn_add_text(wks,plot,day12(k),lon12(k),lat12(k)-0.25,txres)
> end do
> draw(wks)
>
> ; Draw storm number (actually these are strings) at beginning of track
> txres@txFontHeightF <mailto:txres@txFontHeightF> = 0.02 ; 0.0044
> txres@txJust <mailto:txres@txJust> = "CenterLeft"
>
> txres@txPerimOn <mailto:txres@txPerimOn> = True
> txres@txPerimColor <mailto:txres@txPerimColor> = "Black"
> txres@txPerimThicknessF <mailto:txres@txPerimThicknessF> = 1.0
> txres@txPerimSpaceF <mailto:txres@txPerimSpaceF> = 0.4
> txres@txBackgroundFillColor <mailto:txres@txBackgroundFillColor> =
> "White"
> ; gsn_text(wks,plot,ssn,lon(0)+0.6,lat(0),txres)
>
> ; Now draw them at the end
> txres@txJust <mailto:txres@txJust> = "BottomRight"
> ; gsn_text(wks,plot,ssn,lon(nrows-1),lat(nrows-1),txres)
>
> if (.not. TypeOn) then
> txres@txFontHeightF <mailto:txres@txFontHeightF> = 0.02 ; 0.006
> txres@txJust <mailto:txres@txJust> = "CenterCenter"
> txres@txPerimSpaceF <mailto:txres@txPerimSpaceF> = 0.7
> txres@txPerimThicknessF <mailto:txres@txPerimThicknessF> = 1.5
> txres@txConstantSpacingF <mailto:txres@txConstantSpacingF> = 1.0
> txres@txFontAspectF <mailto:txres@txFontAspectF> = 1.5
> txres@txFontThicknessF <mailto:txres@txFontThicknessF> = 0.8
> gsn_text_ndc(wks,"~F02~ Remnant low, tropical wave, and ~C~
> extratropical stages are not shown. ~C~~C~ Subtropical stages are
> dashed.",0.715,0.680,txres)
> end if
> txres@txFontHeightF <mailto:txres@txFontHeightF> = 0.005
> txres@txPerimThicknessF <mailto:txres@txPerimThicknessF> = 1.5
> txres@txPerimSpaceF <mailto:txres@txPerimSpaceF> = 1.0
> txres@txConstantSpacingF <mailto:txres@txConstantSpacingF> = 1.0
> txres@txFontAspectF <mailto:txres@txFontAspectF> = 1.5
> txres@txFontThicknessF <mailto:txres@txFontThicknessF> = 0.8
>
> ;******************
> ; Plot a legend *
> ;******************
> lgres = False
> lgres@lgAutoManage <mailto:lgres@lgAutoManage> = False
>
> lgres@vpWidthF <mailto:lgres@vpWidthF> = 0.2 ; was
> 0.1 ; width of legend (NDC)
> lgres@vpHeightF <mailto:lgres@vpHeightF> = 0.2 ; was
> 0.1 ; height of legend (NDC)
> ; lgres@lgBottomMarginF <mailto:lgres@lgBottomMarginF> = 0.17 ;
> was 0.25
> lgres@lgPerimFill <mailto:lgres@lgPerimFill> =
> 0 ; Use solid fill (0) instead of the default hollow
> fill
> lgres@lgPerimFillColor <mailto:lgres@lgPerimFillColor> = "Background"
> ; lgres@lgBoxMajorExtentF <mailto:lgres@lgBoxMajorExtentF> = 0.4
> lgres@lgBoxMinorExtentF <mailto:lgres@lgBoxMinorExtentF> = 0.2 ;
> controls how wide the box holding the legend items (lines and markers)
> can be in relation to legend
> ; lgres@lgBoxBackground <mailto:lgres@lgBoxBackground> = "PaleTurquoise3"
> lgres@lgMonoItemType <mailto:lgres@lgMonoItemType> =
> False ; indicates that we wish to set the item types
> individually
> lgres@lgMonoMarkerIndex <mailto:lgres@lgMonoMarkerIndex> = False
> lgres@lgMonoLineThickness <mailto:lgres@lgMonoLineThickness> = False
> lgres@lgMonoMarkerThickness <mailto:lgres@lgMonoMarkerThickness> = False
> lgres@lgMonoMarkerSize <mailto:lgres@lgMonoMarkerSize> = False
> ; position fine elements of legend relative to some positional values:
> xlegend = 0.66 ; 0.820
> ylegend = 0.35 ; 0.290
>
> if(TypeOn) then
> lgres@lgLabelFont <mailto:lgres@lgLabelFont> = 0
> lgres@lgLabelFontHeightF <mailto:lgres@lgLabelFontHeightF> =
> 0.012 ; 0.004
> lgres@lgLabelFontAspectF <mailto:lgres@lgLabelFontAspectF> = 1.2
> lgres@lgLabelConstantSpacingF <mailto:lgres@lgLabelConstantSpacingF>
> = 0.0
> lgres@lgItemCount <mailto:lgres@lgItemCount> = 11
> lgres@lgLineDashSegLenF <mailto:lgres@lgLineDashSegLenF> = 0..1
> lgres@lgItemTypes <mailto:lgres@lgItemTypes> =
> (/"Markers","Markers","Markers","Lines","Lines","Lines","Lines","Lines","Lines","Lines","Lines"/)
> lgres@lgMarkerIndexes <mailto:lgres@lgMarkerIndexes> = (/
> 1, 4, 16, 0, 0, 0, 0, 0,
> 0, 0, 0/)
> lgres@lgLineThicknesses <mailto:lgres@lgLineThicknesses> = (/
> 0.1, 0.1, 0.1, 4.0, 4.0, 4.0, 4.0, 4.0,
> 4.0, 4.0, 4.0/)
> lgres@lgMarkerColors <mailto:lgres@lgMarkerColors> = (/
> "White", "Black", "Black"/)
> lgres@lgMarkerSizes <mailto:lgres@lgMarkerSizes> = (/
> 0.0001, 0.004, 0.004/)
> lgres@lgLineColors <mailto:lgres@lgLineColors> = (/ "White",
> "Black", "Black",\
> "SlateBlue1", "LimeGreen",
> "Black", "Blue1", "Dark Orange",
> "LimeGreen", "Yellow", "Red" /) ; colors for
> legend lines
> lgres@lgDashIndexes <mailto:lgres@lgDashIndexes> = (/
> 0, 0, 0,\
> 2, 2,
> 2, 0, 0,
> 0, 0, 0 /) ; dash indexes
> ; gsn_legend_ndc(wks,10, (/"Tropical Cyclone No.","1200 UTC
> Position/Date","0000 UTC Position",\
> ; "Remnant Low","Tropical
> Wave","Extratropical","Subtropical Dep.","Subtropical Storm","Tropical
> Dep.","Tropical Storm (T)","Hurricane (H)"/),xlegend,ylegend,lgres)
> yoffset_day = -0.0858
> yoffset_storm = -0.0910
> else
> lgres@lgLabelFont <mailto:lgres@lgLabelFont> = 0
> lgres@lgLabelFontHeightF <mailto:lgres@lgLabelFontHeightF> = 0.004
> lgres@lgLabelFontAspectF <mailto:lgres@lgLabelFontAspectF> = 1.2
> lgres@lgLabelConstantSpacingF <mailto:lgres@lgLabelConstantSpacingF>
> = 0.0
> lgres@lgItemCount <mailto:lgres@lgItemCount> = 6
> lgres@lgItemTypes <mailto:lgres@lgItemTypes> =
> (/"Markers","Markers","Markers","Lines" ,"Lines" ,"Lines"/)
> lgres@lgLineColors <mailto:lgres@lgLineColors> = (/"White",
> "Black" ,"Black" ,"LimeGreen","Yellow","Red" /) ; colors for
> legend lines
> lgres@lgLineThicknesses <mailto:lgres@lgLineThicknesses> = (/
> 0.1, 0.1, 0.1, 4.0, 4.0, 4.0/)
> lgres@lgDashIndexes <mailto:lgres@lgDashIndexes> = (/
> 0, 0, 0, 0, 0, 0/)
> lgres@lgMarkerIndexes <mailto:lgres@lgMarkerIndexes> = (/
> 0, 4, 16, 0, 0, 0/)
> lgres@lgMarkerColors <mailto:lgres@lgMarkerColors> = (/"White",
> "Black" , "Black"/)
> lgres@lgMarkerSizes <mailto:lgres@lgMarkerSizes> = (/
> 0.0001, 0.004, 0.004/)
> ; gsn_legend_ndc(wks,5,(/"Tropical Cyclone No.","1200 UTC
> Position/Date","0000 UTC Position",\
> ; "Tropical Dep.","Tropical Storm
> (T)","Hurricane (H)"/),xlegend,ylegend,lgres)
> yoffset_day = -0.0750 ; offsets for the case where we don't plot
> all the extra cases
> yoffset_storm = -0.0875
> end if
> ; Now draw a day label on the legend
> txres@txPerimOn <mailto:txres@txPerimOn> = False
> txres@txFontHeightF <mailto:txres@txFontHeightF> = 0.01
> txres@txPerimSpaceF <mailto:txres@txPerimSpaceF> = 0.0
> txres@txJust <mailto:txres@txJust> = "CenterCenter"
> ; gsn_text_ndc(wks,"21",xlegend + 0.0183, ylegend + yoffset_day,txres)
>
> ; Draw storm number on the legend
> txres@txFontHeightF <mailto:txres@txFontHeightF> = 0.004
>
> txres@txPerimOn <mailto:txres@txPerimOn> = True
> txres@txPerimColor <mailto:txres@txPerimColor> = "Black"
> txres@txPerimThicknessF <mailto:txres@txPerimThicknessF> = 1.0
> txres@txPerimSpaceF <mailto:txres@txPerimSpaceF> = 0.4
> txres@txBackgroundFillColor <mailto:txres@txBackgroundFillColor> =
> "White"
> ; gsn_text_ndc(wks,"3",xlegend + 0.0142, ylegend +
> yoffset_storm,txres)
> ; drawNDCGrid(wks) ; Use to put on a grid for fine-tuning placement
>
> frame(wks)
>
> end
>
> --- *2009年11月20日 星期五,Jonathan Vigh /<vigh@atmos.colostate.edu>/*
> 寫道﹕
>
>
> 寄件人: Jonathan Vigh <vigh@atmos.colostate.edu>
> 主題: Re: [ncl-talk] question about plotting typhoon best track
> 收件人: "Dennis Shea" <shea@ucar.edu>
> 副本(CC): "Li Richard" <lcy114@yahoo.com.hk>, ncl-talk@ucar.edu
> 日期: 2009年11月20日,星期五,下午5:14
>
> Hi Li,
> If you just want to plot one typhoon track, check out the
> attached script - this should be easier than trying to adapt
> unique_1.ncl. You'll still need to revamp the data read section a
> bit - Dennis's e-mail should help you with that.
>
> Best regards,
> Jonathan
>
>
> Dennis Shea wrote:
>> The unique_1.ncl was written long before the str_* functions were
>> created. The attached script uses "str_get_col" to extract some of
>> the data. You can expand as needed.
>>
>> The unique_1.ncl predefined storm names and numbers.
>> You will have to create code that performs that task.
>>
>> Anyway, the attached script should get you started.
>>
>> Good luck
>>
>>
>> Li Richard wrote:
>>> Hello everyone,
>>> I would like to know how can I plot the typhoon best track using
>>> ncl. I have found a similar code unique_1.ncl
>>> <http://www.ncl.ucar.edu/Applications/Scripts/unique_1.ncl> on
>>> the web page of application example, but I don't know how to read
>>> in the data I get from the JTWC. An example of the data can be
>>> seen in the attachment. I would be much appreciated if anyone can
>>> kindly answer my question. Thank you.
>>> Richard
>>>
>>> ;********************************************************
>>> ; unique_1.ncl
>>> ;
>>> ; The purpose of this script is to plot the best tracks
>>> ; for a given season storms including all data (subtropical
>>> ; storms, depressions, extrtropical lows, etc.)
>>> ;********************************************************
>>> 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/csm/contributed.ncl"
>>> load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"
>>> begin
>>> ; First set the year and number of storms in the season
>>> ; yyyy = 2001
>>> ; ncurves = 17
>>> ; nstorms = 17
>>> ; yyyy = 2002
>>> ; ncurves = 14
>>> ; nstorms = 17
>>> yyyy = 2003
>>> ncurves = 21
>>> nstorms = 21
>>> bcurve = 0 ; Start at first storm
>>> ; Next, set the plotting parameters (which cases to plot)
>>> ;
>>> ; Note that this script probably won't work for TypeOn = False,
>>> because
>>> ; we don't have the data file for it.
>>> ;
>>> TypeOn = True ; If you just want the
>>> legend to have the basic (H, TS, and TD) designators (* and S),
>>> set TypeOn to False
>>> ; NOTE -- this will cause the program to grab a
>>> different input file -- one in which all the
>>> ; extratropical (E), remnant low (L), and wave cases
>>> (W) have been taken out; additionally,
>>> ; there will not be a distinction between the S and *
>>> cases (they will just be plotted according to
>>> ; intensity
>>> PlotSubTropicalSegments = True ; If you wish to exclude
>>> all subtropical line segments, set to False
>>> ; Note: if TypeOn is set to False, the following (W, L, E)
>>> cases won't be plotted regardless of their value
>>> PlotWaveSegments = True ; If you wish to exclude all
>>> wave segments, set to False
>>> PlotLowSegments = True ; If you wish to exclude all
>>> remnant low segments, set to False
>>> PlotExtraTropicalSegments = True ; If you wish to exclude
>>> all extratropical line sements, set to False if (yyyy.eq.2001) then
>>> name =
>>> (/"Allison","Two","Barry","Chantal","Dean","Erin","Felix","Gabrielle","Nine","Humberto","Iris","Jerry","Karen","Lorenzo","Michelle","Noel","Olga"/)
>>>
>>> ssn =
>>> (/"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17"/)
>>>
>>> end if if (yyyy.eq.2002) then
>>> name =
>>> (/"Arthur","Bertha","Cristobal","Dolly","Edouard","Fay","Seven","Gustav","Hanna","Isidore","Josephine","Kyle","Lili","Fourteen"/)
>>>
>>> ssn =
>>> (/"1","2","3","4","5","6","7","8","9","10","11","12","13","14"/)
>>> end if
>>>
>>> if (yyyy.eq.2003) then
>>> name =
>>> (/"Ana","Two","Bill","Claudette","Danny","Six","Seven","Erika","Nine","Fabian","Grace","Henri","Isabel","Fourteen","Juan","Kate","Larry","Mindy","Nicholas","Odette","Peter"/)
>>>
>>> ssn =
>>> (/"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21"/)
>>>
>>> end if
>>>
>>> ;********************************
>>> ; get data
>>> ;********************************
>>> if(TypeOn) then
>>> tStr = asciiread("best_all_" + yyyy + ".inp", -1,"string")
>>> ; Info includes type so cases can be weeded out
>>> else
>>> tStr = asciiread("best_" + yyyy + ".inp", -1,"string") ;
>>> Info includes type so cases can be weeded out
>>> end if tChr = stringtochar(tStr)
>>>
>>> nrows = dimsizes(tStr)
>>>
>>> sn = stringtofloat( chartostring(tChr(:,0:1)) )
>>> year = stringtofloat( chartostring(tChr(:,2:3)) )
>>> month = stringtofloat( chartostring(tChr(:,4:5)) ) day =
>>> stringtofloat( chartostring(tChr(:,6:7)) )
>>> hour = stringtofloat( chartostring(tChr(:,8:9)) )
>>>
>>> lat = stringtofloat( chartostring(tChr(:,10:13)) )
>>> lon = stringtofloat( chartostring(tChr(:,15:18)) )
>>> vmax = stringtofloat( chartostring(tChr(:,21:23)) )
>>>
>>> type = chartostring(tChr(:,30:30))
>>>
>>> beginning = new((/ncurves/),integer)
>>> ending = new((/ncurves/),integer)
>>> ic = 0
>>> beginning(ic) = 0
>>> do i=1,dimsizes(hour)-1
>>>
>>> ; Look for end of storm record (first check to see if at end of
>>> file)
>>> if (i.eq.dimsizes(hour)-1) then
>>> ending(ic) = i
>>> else if (sn(i-1).ne.sn(i)) then
>>> ending(ic) = i-1
>>> ic = ic + 1
>>> beginning(ic) = i
>>> end if end if
>>> end do
>>> lengths = ending - beginning + 1
>>> max_npts = max(lengths) ; Max #
>>> of points.
>>>
>>> ; Now rearrange the arrays to hold individual curve data
>>> msg_val = -999. ; Set to a safe missing value.
>>>
>>> new_lat = new((/ncurves,max_npts/),float,msg_val)
>>> new_lon = new((/ncurves,max_npts/),float,msg_val)
>>> new_hour = new((/ncurves,max_npts/),float,msg_val)
>>> new_day = new((/ncurves,max_npts/),string,msg_val)
>>> new_vmax = new((/ncurves,max_npts/),float,msg_val)
>>> new_type = new((/ncurves,max_npts/),string,msg_val)
>>>
>>> do nc = bcurve,ncurves-1
>>> new_lat(nc,0:lengths(nc)-1) =
>>> lat(beginning(nc):ending(nc))/10.0
>>> new_lon(nc,0:lengths(nc)-1) =
>>> -lon(beginning(nc):ending(nc))/10.0
>>> new_hour(nc,0:lengths(nc)-1) = hour(beginning(nc):ending(nc))
>>> new_day(nc,0:lengths(nc)-1) = day(beginning(nc):ending(nc))
>>> new_vmax(nc,0:lengths(nc)-1) = vmax(beginning(nc):ending(nc))
>>> new_type(nc,0:lengths(nc)-1) =
>>> type(beginning(nc):ending(nc)) end do
>>> ; Now create arrays that only hold the points for the 00z
>>> locations
>>> lat0 = mask(new_lat,new_hour,0)
>>> lon0 = mask(new_lon,new_hour,0)
>>>
>>> lat12 = mask(new_lat,new_hour,12)
>>> lon12 = mask(new_lon,new_hour,12)
>>> day12 = mask(new_day,new_hour,12)
>>>
>>> ;********************************
>>> ; select sub-regions
>>> ;********************************
>>> minlat = 0.0 ; deg N
>>> maxlat = 57.0 ; deg N
>>> minlon = -100.0 ; - deg E = deg W
>>> maxlon = -20.0 ; - deg E = deg W
>>> ;***** Define some NICE color maps to use.
>>> colors_6 =
>>> (/"White","Black","Black","MediumPurple1","MediumPurple3","Blue1",\
>>>
>>> "CadetBlue3","Aquamarine2","SeaGreen2","LawnGreen","Green4", \
>>>
>>> "GreenYellow","Gold","Tan1","Sienna1","Tomato","VioletRed1", \
>>>
>>> "Yellow","DarkGreen","Grey37","Red","Orange","GoldenRod1","DarkOrange","SteelBlue1","SlateBlue1",
>>> \
>>>
>>> "LightSlateBlue","DarkSeaGreen","Magenta","DodgerBlue","Moccasin"/)
>>> ;********************************
>>> ; create plot
>>> ;********************************
>>> wks = gsn_open_wks("ps","unique")
>>> gsn_define_colormap(wks,colors_6)
>>> res = True
>>> res@gsnMaximize <mailto:res@gsnMaximize> = True
>>> res@gsnPaperOrientation <mailto:res@gsnPaperOrientation> =
>>> "Portrait"
>>> res@gsnDraw <mailto:res@gsnDraw> = False ; so we
>>> can add poly stuff
>>> res@gsnFrame <mailto:res@gsnFrame> = False ; do not
>>> advance frame
>>> res@mpDataBaseVersion <mailto:res@mpDataBaseVersion> =
>>> "Ncarg4_1" ; Alias 'MediumRes'
>>> res@mpDataSetName <mailto:res@mpDataSetName> = "Earth..1"
>>> res@mpProjection <mailto:res@mpProjection> =
>>> "LambertConformal"
>>> res@mpLambertParallel1F <mailto:res@mpLambertParallel1F> = 20.0
>>> res@mpLambertParallel2F <mailto:res@mpLambertParallel2F> = 40.0
>>> res@mpLambertMeridianF <mailto:res@mpLambertMeridianF> = -60.0
>>> res@mpLimitMode <mailto:res@mpLimitMode> = "LatLon"
>>> res@mpMinLatF <mailto:res@mpMinLatF> = minlat
>>> res@mpMaxLatF <mailto:res@mpMaxLatF> = maxlat
>>> res@mpMinLonF <mailto:res@mpMinLonF> = minlon
>>> res@mpMaxLonF <mailto:res@mpMaxLonF> = maxlon
>>>
>>> res@mpFillOn <mailto:res@mpFillOn> = True ;
>>> False to turn off gray continents
>>> res@mpOutlineOn <mailto:res@mpOutlineOn> = True
>>> ; turn on continental outline
>>> res@mpOutlineBoundarySets <mailto:res@mpOutlineBoundarySets>
>>> = "AllBoundaries"
>>> res@mpLandFillColor <mailto:res@mpLandFillColor> =
>>> "GoldenRod1"
>>> res@mpInlandWaterFillColor <mailto:res@mpInlandWaterFillColor>
>>> = "PaleTurquoise3"
>>> res@mpOceanFillColor <mailto:res@mpOceanFillColor> =
>>> "PaleTurquoise3"
>>> res@mpGeophysicalLineColor
>>> <mailto:res@mpGeophysicalLineColor> = "Grey37"
>>> res@mpGeophysicalLineThicknessF
>>> <mailto:res@mpGeophysicalLineThicknessF> = 0.5
>>> res@mpUSStateLineColor
>>> <mailto:res@mpUSStateLineColor> = "Grey37"
>>> res@mpUSStateLineThicknessF
>>> <mailto:res@mpUSStateLineThicknessF> = 0.5
>>> res@mpNationalLineColor <mailto:res@mpNationalLineColor>
>>> = "Grey37"
>>> res@mpNationalLineThicknessF
>>> <mailto:res@mpNationalLineThicknessF> = 0..5
>>> res@mpGridAndLimbOn <mailto:res@mpGridAndLimbOn> =
>>> "True"
>>> res@mpGridAndLimbDrawOrder <mailto:res@mpGridAndLimbDrawOrder>
>>> = "Draw"
>>> res@mpGridMaskMode <mailto:res@mpGridMaskMode> =
>>> "MaskLand"
>>> res@mpGridSpacingF <mailto:res@mpGridSpacingF> = 5.0
>>> res@mpGridLineColor <mailto:res@mpGridLineColor> =
>>> "Grey37"
>>> res@tmXBLabelFontHeightF <mailto:res@tmXBLabelFontHeightF> =
>>> 0.005
>>> res@tmXBMajorLengthF <mailto:res@tmXBMajorLengthF> = -0.001
>>> res@pmTickMarkDisplayMode <mailto:res@pmTickMarkDisplayMode> =
>>> "Always"
>>>
>>> ;***************************************
>>> ; plot base map *
>>> ;***************************************
>>> plot = gsn_csm_map(wks,res) ; draw one of eight map
>>> projections
>>> ;***************************************
>>> ; Draw best track history as polylines *
>>> ;***************************************
>>> res_poly = True ; polyline mods desired
>>>
>>> ; Create array of dummy graphic variables. This is required, b/c
>>> each line
>>> ; must be associated with a unique dummy variable.
>>> dum = new(dimsizes(hour),graphic) ic = 0
>>> do i=0,ncurves-1
>>> do k=0,max_npts-2
>>> if(.not.ismissing(new_lat(i,k)))
>>> res_poly@gsLineDashPattern
>>> <mailto:res_poly@gsLineDashPattern> = 0
>>> res_poly@gsLineThicknessF
>>> <mailto:res_poly@gsLineThicknessF> = 4 if(.not. TypeOn) then
>>> ; Plot hurricane segments
>>> if((new_vmax(i,k).gt.64).and.(new_type(i,k).eq."*")) then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> =
>>> "Red" dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1
>>> end if
>>> ; Plot tropical storm segments
>>> if((new_vmax(i,k).lt.64).and.(new_vmax(i,k).gt.34).and.(new_type(i,k).eq."*"))
>>> then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> = "Yellow"
>>> dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1 end if ; Plot tropical
>>> depression segments
>>> if((new_vmax(i,k).lt.34).and.(new_type(i,k).eq."*")) then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> = "DarkGreen"
>>> dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1
>>> end if
>>> ; Now plot the subtropical segments with dashed lines
>>> ; Plot hurricane segments of subtropical systems with dashed red
>>> lines
>>> if((new_vmax(i,k).gt.64).and.(new_type(i,k).eq."S")) then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> =
>>> "Red" res_poly@gsLineDashPattern
>>> <mailto:res_poly@gsLineDashPattern> = 2
>>> res_poly@gsLineDashSegLenF
>>> <mailto:res_poly@gsLineDashSegLenF> = 0.1
>>> dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1
>>> end if
>>> ; Plot tropical storm segments of subtropical systems with dashed
>>> yellow lines
>>> if((new_vmax(i,k).lt.64).and.(new_vmax(i,k).gt.34).and.(new_type(i,k).eq."S"))
>>> then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> = "Yellow"
>>> res_poly@gsLineDashPattern
>>> <mailto:res_poly@gsLineDashPattern> = 2
>>> res_poly@gsLineDashSegLenF
>>> <mailto:res_poly@gsLineDashSegLenF> = 0.1
>>> dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1 end if ; Plot tropical
>>> depression segments of subtropical systems with dashed dark green
>>> lines
>>> if((new_vmax(i,k).lt.34).and.(new_type(i,k).eq."S")) then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> = "DarkGreen"
>>> res_poly@gsLineDashPattern
>>> <mailto:res_poly@gsLineDashPattern> = 2
>>> res_poly@gsLineDashSegLenF
>>> <mailto:res_poly@gsLineDashSegLenF> = 0.1
>>> dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1
>>> end if
>>> else ; if(TypeOn) -- plot pure tropical segments as solid
>>> lines (red for hurricane, etc.).
>>> ; Plot hurricane segments
>>> if((new_vmax(i,k).gt.64).and.(new_type(i,k).eq."*")) then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> =
>>> "Red" dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1
>>> end if
>>> ; Plot tropical storm segments
>>> if((new_vmax(i,k).lt.64).and.(new_vmax(i,k).gt.34).and.(new_type(i,k).eq."*"))
>>> then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> = "Yellow"
>>> dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1 end if ; Plot tropical
>>> depression segments
>>> if((new_vmax(i,k).lt.34).and.(new_type(i,k).eq."*")) then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> = "DarkGreen"
>>> dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1
>>> end if
>>> if(PlotWaveSegments) then ; Plot tropical wave segments
>>> if(new_type(i,k).eq."W") then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> = "DarkGreen"
>>> res_poly@gsLineDashPattern
>>> <mailto:res_poly@gsLineDashPattern> = 2
>>> res_poly@gsLineDashSegLenF
>>> <mailto:res_poly@gsLineDashSegLenF> = 0.1
>>> dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1
>>> end if
>>> end if
>>> if(PlotLowSegments) then ; Plot remanant low segments
>>> if(new_type(i,k).eq."L") then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> = "SlateBlue"
>>> res_poly@gsLineDashPattern
>>> <mailto:res_poly@gsLineDashPattern> = 2
>>> res_poly@gsLineDashSegLenF
>>> <mailto:res_poly@gsLineDashSegLenF> = 0.1
>>> dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1
>>> end if
>>> end if
>>> if(PlotSubTropicalSegments) then
>>> ; Plot subtropical storm segments
>>> if((new_vmax(i,k).gt.34).and.(new_type(i,k).eq."S")) then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> =
>>> "DarkOrange" dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1 end if
>>> ; Plot subtropical depression segments
>>> if((new_vmax(i,k).lt.34).and.(new_type(i,k).eq."S")) then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> = "Blue1"
>>> dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1
>>> end if
>>> end if
>>>
>>> if(PlotExtraTropicalSegments) then ; Plot extratropical segments
>>> if(new_type(i,k).eq."E") then
>>> res_poly@gsLineColor
>>> <mailto:res_poly@gsLineColor> = "Black"
>>> res_poly@gsLineDashPattern <mailto:res_poly@gsLineDashPattern> = 2
>>> res_poly@gsLineDashSegLenF
>>> <mailto:res_poly@gsLineDashSegLenF> = 0.1
>>> dum(ic) =
>>> gsn_add_polyline(wks,plot,new_lon(i,k:k+1),new_lat(i,k:k+1),res_poly)
>>>
>>> ic = ic + 1
>>> end if
>>> end if
>>> end if
>>>
>>> end if
>>> end do
>>> end do
>>> ;***************************************
>>> ; Draw black polymarkers at 00Z locations
>>> ;***************************************
>>> res_mark = True
>>> res_mark@gsMarkerIndex <mailto:res_mark@gsMarkerIndex> =
>>> 1 ; polymarker style
>>> res_mark@gsMarkerSizeF <mailto:res_mark@gsMarkerSizeF> =
>>> 0.012 ; polymarker size
>>> res_mark@gsMarkerColor <mailto:res_mark@gsMarkerColor> =
>>> "Black" ; change marker color
>>> duma = new(ncurves,graphic)
>>> do ic=bcurve,ncurves-1
>>> duma(ic) =
>>> gsn_add_polymarker(wks,plot,lon0(ic,:),lat0(ic,:),res_mark)
>>> end do
>>> ; Now draw white polymarkers at 12z locations
>>> res_mark@gsMarkerIndex <mailto:res_mark@gsMarkerIndex> = 1
>>> res_mark@gsMarkerSizeF <mailto:res_mark@gsMarkerSizeF> =
>>> 0.012 ; polymarker size
>>> res_mark@gsMarkerColor <mailto:res_mark@gsMarkerColor> =
>>> "White" ; change marker color
>>> dumb = new(ncurves,graphic)
>>> do ic=bcurve,ncurves-1
>>> dumb(ic) =
>>> gsn_add_polymarker(wks,plot,lon12(ic,:),lat12(ic,:),res_mark)
>>> end do
>>> ;***************************
>>> ; Plot some text labels *
>>> ;***************************
>>>
>>> txres = True
>>> ; Now draw the day labels each 00Z marker
>>> txres@txFontHeightF <mailto:txres@txFontHeightF> = 0.0035
>>> txres@txJust <mailto:txres@txJust> = "TopCenter"
>>> ;
>>> ; Count number of text strings we'll be adding. There is probably
>>> ; a better way to do this (so you don't have to use a double do
>>> loop).
>>> ;
>>> ntext = 0
>>> do i=bcurve,ncurves-1
>>> do k=0,lengths(i)-1
>>>
>>> if(.not.ismissing(day12(i,k)).and..not.ismissing(lon12(i,k)).and.\
>>>
>>> .not.ismissing(lat12(i,k))) then
>>> ntext = ntext + 1
>>> end if
>>> end do
>>> end do
>>> dumt1 = new(ntext,graphic)
>>> dumt2 = new(ncurves-bcurve,graphic)
>>> dumt3 = new(ncurves-bcurve,graphic)
>>> ii = 0
>>> do i=bcurve,ncurves-1
>>> do k=0,lengths(i)-1
>>>
>>> if(.not.ismissing(day12(i,k)).and..not.ismissing(lon12(i,k)).and.\
>>>
>>> .not.ismissing(lat12(i,k))) then
>>> dumt1(ii) =
>>> gsn_add_text(wks,plot,day12(i,k),lon12(i,k),lat12(i,k)-0.45,txres)
>>> ii = ii + 1
>>> end if
>>> end do
>>> end do ; Draw storm number (actually these are strings) at
>>> beginning of track txres@txFontHeightF
>>> <mailto:txres@txFontHeightF> = 0.0044
>>> txres@txJust <mailto:txres@txJust> = "CenterLeft"
>>> txres@txPerimOn <mailto:txres@txPerimOn> = True
>>> txres@txPerimColor <mailto:txres@txPerimColor> = "Black"
>>> txres@txPerimThicknessF <mailto:txres@txPerimThicknessF> =
>>> 1.0
>>> txres@txPerimSpaceF <mailto:txres@txPerimSpaceF> = 0.4
>>> txres@txBackgroundFillColor
>>> <mailto:txres@txBackgroundFillColor> = "White"
>>> do i=bcurve,ncurves-1
>>>
>>> if(.not.ismissing(ssn(i)).and..not.ismissing(new_lon(i,0)).and.\
>>> .not.ismissing(new_lat(i,0)))
>>> then
>>> dumt2(i-bcurve) =
>>> gsn_add_text(wks,plot,ssn(i),new_lon(i,0)+0.6, \
>>>
>>> new_lat(i,0),txres)
>>> end if
>>> end do
>>> ; Now draw them at the end
>>> txres@txJust <mailto:txres@txJust> = "BottomRight"
>>> do i=bcurve,ncurves-1
>>> if(.not.ismissing(ssn(i)).and. \
>>> .not.ismissing(new_lon(i,lengths(i)-1)).and.\
>>> .not.ismissing(new_lat(i,lengths(i)-1))) then
>>> dumt3(i-bcurve) = gsn_add_text(wks,plot,ssn(i), \
>>> new_lon(i,lengths(i)-1), \
>>>
>>> new_lat(i,lengths(i)-1),txres)
>>> end if
>>> end do
>>> txres@txFontHeightF <mailto:txres@txFontHeightF> = 0.007
>>> txres@txJust <mailto:txres@txJust> = "CenterCenter"
>>> txres@txPerimSpaceF <mailto:txres@txPerimSpaceF> = 1.0
>>> txres@txPerimThicknessF <mailto:txres@txPerimThicknessF> = 1.5
>>> txres@txConstantSpacingF <mailto:txres@txConstantSpacingF> =
>>> 1.0
>>> txres@txFontAspectF <mailto:txres@txFontAspectF> = 1.5
>>> txres@txFontThicknessF <mailto:txres@txFontThicknessF> = 0.4
>>> txres@gsnDraw <mailto:txres@gsnDraw> = False
>>> ;
>>> ; Note: the X and Y positions in this case don't matter, because the
>>> ; text will get repositioned in the "gsn_add_anotation" function.
>>> ;
>>> lambert_text = gsn_create_text(wks,"~F02~ Lambert Conformal
>>> Conic ~C~ True at 20~0557~ and 40~0557~ North ",txres)
>>>
>>> if (.not. TypeOn) then
>>> txres@txFontHeightF <mailto:txres@txFontHeightF> = 0.006
>>> txres@txJust <mailto:txres@txJust> = "CenterCenter"
>>> txres@txPerimSpaceF <mailto:txres@txPerimSpaceF> = 0.7
>>> txres@txPerimThicknessF <mailto:txres@txPerimThicknessF> = 1.5
>>> txres@txConstantSpacingF <mailto:txres@txConstantSpacingF> =
>>> 1.0
>>> txres@txFontAspectF <mailto:txres@txFontAspectF> = 1.5
>>> txres@txFontThicknessF <mailto:txres@txFontThicknessF> = 0.8
>>> txres@gsnDraw <mailto:txres@gsnDraw> = True
>>> gsn_text_ndc(wks,"~F02~ Remnant low, tropical wave, and ~C~
>>> extratropical stages are not shown. ~C~~C~ Subtropical stages are
>>> dashed.",0.715,0.680,txres)
>>> end if
>>> txres@txFontHeightF <mailto:txres@txFontHeightF> = 0.012
>>> txres@txPerimThicknessF <mailto:txres@txPerimThicknessF> = 1.5
>>> txres@txPerimSpaceF <mailto:txres@txPerimSpaceF> = 0.5
>>> txres@txConstantSpacingF <mailto:txres@txConstantSpacingF> =
>>> 1.0
>>> txres@txFontAspectF <mailto:txres@txFontAspectF> = 1.5
>>> txres@txFontThicknessF <mailto:txres@txFontThicknessF> = 1.6
>>> txres@gsnDraw <mailto:txres@gsnDraw> = False
>>> ;
>>> ; Note: the X and Y positions in this case don't matter, because the
>>> ; text will get repositioned in the "gsn_add_anotation" function.
>>> ;
>>> atlantic_text = gsn_create_text(wks,"~F02~ " + yyyy + "
>>> Atlantic Tropical Cyclones",txres)
>>> txres@txFontHeightF <mailto:txres@txFontHeightF> = 0.005
>>> txres@txPerimThicknessF <mailto:txres@txPerimThicknessF> = 1.5
>>> txres@txPerimSpaceF <mailto:txres@txPerimSpaceF> = 1.0
>>> txres@txConstantSpacingF <mailto:txres@txConstantSpacingF> =
>>> 1.0
>>> txres@txFontAspectF <mailto:txres@txFontAspectF> = 1.5
>>> txres@txFontThicknessF <mailto:txres@txFontThicknessF> = 0.8
>>> if (yyyy .eq. 2001) then
>>> txres@gsnDraw <mailto:txres@gsnDraw> = True
>>> gsn_text_ndc(wks,"~F02~ 1 T Allison 05-17 Jun. ~C~
>>> 2 Two 11-12 Jul. ~C~ 3 T Barry 02-07 Aug.
>>> ~C~ 4 T Chantal 14-22 Aug. ~C~ 5 T Dean 22-28
>>> Aug. ~C~ 6 H Erin 01-15 Sep. ~C~ 7 H Felix
>>> 06-18 Sep.~C~",0.263,0.650,txres)
>>> gsn_text_ndc(wks,"~F02~ 8 H Gabrielle 11-19 Sep. ~C~ 9
>>> Nine 19-20 Sep. ~C~10 H Humberto 21-27 Sep.
>>> ~C~11 H Iris 04-09 Oct. ~C~12 T Jerry 06-08
>>> Oct. ~C~13 H Karen 12-15 Oct. ~C~14 T Lorenzo
>>> 27-31 Oct.~C~",0.263,0..355,txres)
>>> gsn_text_ndc(wks,"~F02~15 H Michelle 29 Oct.-05
>>> Nov.~C~16 H Noel 04-06 Nov. ~C~17 H Olga 24
>>> Nov.-04
>>> Dec.~C~"
>>> ,0.263,0.310,txres)
>>> end if if (yyyy .eq. 2002) then
>>> txres@gsnDraw <mailto:txres@gsnDraw> = True
>>> gsn_text_ndc(wks,"~F02~ 1 T Arthur 14-16 Jul. ~C~
>>> 2 T Bertha 04-09 Aug. ~C~ 3 T Cristobal 05-08 Aug.
>>> ~C~ 4 T Dolly 29 Aug.-04 Sep.~C~ 5 T Edouard 01-06
>>> Sep. ~C~ 6 T Fay 05-08 Sep. ~C~ 7 Seven
>>> 07-08 Sep.~C~",0.263,0.650,txres)
>>> gsn_text_ndc(wks,"~F02~ 8 H Gustav 08-12 Sep. ~C~
>>> 9 T Hanna 11-14 Sep. ~C~10 H Isidore 14-26 Sep.
>>> ~C~11 T Josephine 17-19 Sep. ~C~12 H Kyle 20 Sep.-12
>>> Oct.~C~13 H Lili 21 Sep.-04 Oct.~C~14 Fourteen 14-16
>>> Oct.~C~",0.263,0.360,txres)
>>> end if
>>> if(yyyy .eq. 2003) then
>>> txres@txFontHeightF <mailto:txres@txFontHeightF> =
>>> 0.0075
>>> txres@gsnDraw <mailto:txres@gsnDraw> = False
>>> ana_text = gsn_create_text(wks,"~F02~ 1 T Ana 20-24
>>> Apr. ~C~ 2 Two 10-11 Jun. ~C~ 3 T Bill 29
>>> Jun.-02 Jul.~C~ 4 H Claudette 08-17 Jul. ~C~ 5 H Danny
>>> 16-21 Jul. ~C~ 6 Six 19-21 Jul. ~C~ 7
>>> Seven 25-27 Jul.~C~",txres)
>>> erika_text = gsn_create_text(wks,"~F02~ 8 H Erika 14-17
>>> Aug. ~C~ 9 Nine 21-22 Aug. ~C~10 H Fabian 27
>>> Aug.-08 Sep.~C~11 T Grace 30-02 Sep. ~C~12 T Henri
>>> 03-08 Sep. ~C~13 H Isabel 06-19 Sep. ~C~14
>>> Fourteen 08-10 Sep.~C~",txres)
>>> juan_text = gsn_create_text(wks,"~F02~15 H Juan 24-29
>>> Sep. ~C~16 H Kate 25 Sep.-07 Oct.~C~17 T Larry
>>> 01-06 Oct. ~C~18 T Mindy 10-14 Oct. ~C~19 T
>>> Nicholas 13-23 Oct. ~C~20 T Odette 04-07 Dec. ~C~21
>>> T Peter 07-11 Dec.~C~",txres)
>>> amres = True
>>> amres@amParallelPosF <mailto:amres@amParallelPosF> = -0.49
>>> amres@amOrthogonalPosF <mailto:amres@amOrthogonalPosF> = -0.43
>>> amres@amJust <mailto:amres@amJust> = "TopLeft"
>>> txid1 = gsn_add_annotation(plot,ana_text,amres)
>>> amres@amParallelPosF <mailto:amres@amParallelPosF> = -0.49
>>> amres@amOrthogonalPosF <mailto:amres@amOrthogonalPosF> = 0..35
>>> amres@amJust <mailto:amres@amJust> = "BottomLeft"
>>> txid2 = gsn_add_annotation(plot,erika_text,amres)
>>> amres@amParallelPosF <mailto:amres@amParallelPosF> = -0.49
>>> amres@amOrthogonalPosF <mailto:amres@amOrthogonalPosF> = 0..35
>>> amres@amJust <mailto:amres@amJust> = "TopLeft"
>>> txid3 = gsn_add_annotation(plot,juan_text,amres)
>>> end if
>>> ;******************
>>> ; Plot a legend *
>>> ;******************
>>> lgres = True
>>>
>>> lgres@lgAutoManage <mailto:lgres@lgAutoManage> = False
>>>
>>> lgres@vpWidthF <mailto:lgres@vpWidthF> = 0.1 ;
>>> was 0.08 ; width of legend (NDC)
>>> lgres@vpHeightF <mailto:lgres@vpHeightF> = 0.1 ;
>>> was 0.08 ; height of legend (NDC)
>>> ; lgres@lgBottomMarginF <mailto:lgres@lgBottomMarginF> =
>>> 0.17 ; was 0.25
>>> lgres@lgPerimFill <mailto:lgres@lgPerimFill> =
>>> 0 ; Use solid fill (0) instead of the default
>>> hollow fill
>>> lgres@lgPerimFillColor <mailto:lgres@lgPerimFillColor> =
>>> "Background"
>>> ; lgres@lgBoxMajorExtentF <mailto:lgres@lgBoxMajorExtentF> = 0.4
>>> lgres@lgBoxMinorExtentF <mailto:lgres@lgBoxMinorExtentF> = 0.2
>>> ; controls how wide the box holding the legend items (lines and
>>> markers) can be in relation to legend
>>>
>>> ; lgres@lgBoxBackground <mailto:lgres@lgBoxBackground> =
>>> "PaleTurquoise3"
>>>
>>> lgres@lgMonoItemType <mailto:lgres@lgMonoItemType> =
>>> False ; indicates that we wish to set the item
>>> types individually
>>> lgres@lgMonoMarkerIndex <mailto:lgres@lgMonoMarkerIndex> =
>>> False
>>> lgres@lgMonoLineThickness <mailto:lgres@lgMonoLineThickness> =
>>> False
>>> lgres@lgMonoMarkerThickness <mailto:lgres@lgMonoMarkerThickness>
>>> = False
>>> lgres@lgMonoMarkerSize <mailto:lgres@lgMonoMarkerSize> = False
>>> ; Position fine elements of legend relative to some positional
>>> values:
>>> if (yyyy .eq. 2002) then
>>> xlegend = 0.710
>>> ylegend = 0.350
>>> else
>>> xlegend = 0.680
>>> ylegend = 0.390
>>> end if
>>> if(TypeOn) then
>>> lgres@lgLabelFont <mailto:lgres@lgLabelFont> = 0
>>> lgres@lgLabelFontHeightF
>>> <mailto:lgres@lgLabelFontHeightF> = 0.04
>>> lgres@lgLabelFontAspectF
>>> <mailto:lgres@lgLabelFontAspectF> = 1.2
>>> lgres@lgLabelConstantSpacingF
>>> <mailto:lgres@lgLabelConstantSpacingF> = 0.0
>>> lgres@lgItemCount <mailto:lgres@lgItemCount> = 11
>>> lgres@lgLineDashSegLenF <mailto:lgres@lgLineDashSegLenF> = 0..1
>>> lgres@lgItemTypes <mailto:lgres@lgItemTypes> =
>>> (/"Markers","Markers","Markers","Lines","Lines","Lines","Lines","Lines","Lines","Lines","Lines"/)
>>>
>>> lgres@lgMarkerIndexes <mailto:lgres@lgMarkerIndexes> =
>>> (/ 1, 4, 16, 0, 0, 0,
>>> 0, 0, 0, 0, 0/)
>>> lgres@lgLineThicknesses <mailto:lgres@lgLineThicknesses> =
>>> (/ 0.1, 0.1, 0.1, 4.0, 4.0, 4.0,
>>> 4.0, 4.0, 4.0, 4.0, 4.0/)
>>> lgres@lgMarkerColors <mailto:lgres@lgMarkerColors> = (/
>>> "White", "Black", "Black"/)
>>> lgres@lgMarkerSizes <mailto:lgres@lgMarkerSizes> = (/
>>> 0.0001, 0.004, 0.004/)
>>> lgres@lgLineColors <mailto:lgres@lgLineColors> = (/
>>> "White", "Black", "Black",\
>>> "SlateBlue1", "DarkGreen",
>>> "Black", "Blue1", "Dark Orange",
>>> "DarkGreen", "Yellow", "Red" /) ; colors
>>> for legend lines
>>> lgres@lgDashIndexes <mailto:lgres@lgDashIndexes> =
>>> (/ 0, 0, 0,\
>>> 2,
>>> 2, 2, 0,
>>> 0, 0, 0, 0 /)
>>> ; dash indexes
>>> legend_labels = (/"Tropical Cyclone No.","1200 UTC
>>> Position/Date", \
>>> "0000 UTC Position","Remnant Low","Tropical
>>> Wave", \
>>> "Extratropical","Subtropical
>>> Dep.","Subtropical Storm",\
>>> "Tropical Dep.","Tropical Storm
>>> (T)","Hurricane (H)"/)
>>> legend = gsn_create_legend(wks,10,legend_labels,lgres)
>>> yoffset_day = -0.0858
>>> yoffset_storm = -0.0910
>>> else
>>>
>>> lgres@lgLabelFont <mailto:lgres@lgLabelFont> = 0
>>> lgres@lgLabelFontHeightF
>>> <mailto:lgres@lgLabelFontHeightF> = 0.004
>>> lgres@lgLabelFontAspectF
>>> <mailto:lgres@lgLabelFontAspectF> = 1.2
>>> lgres@lgLabelConstantSpacingF
>>> <mailto:lgres@lgLabelConstantSpacingF> = 0.0
>>> lgres@lgItemCount <mailto:lgres@lgItemCount> = 6
>>> lgres@lgItemTypes <mailto:lgres@lgItemTypes> =
>>> (/"Markers","Markers","Markers","Lines" ,"Lines" ,"Lines"/)
>>> lgres@lgLineColors <mailto:lgres@lgLineColors> =
>>> (/"White", "Black" ,"Black" ,"DarkGreen","Yellow","Red" /)
>>> ; colors for legend lines
>>> lgres@lgLineThicknesses <mailto:lgres@lgLineThicknesses> =
>>> (/ 0.1, 0.1, 0.1, 4.0, 4.0, 4.0/)
>>> lgres@lgDashIndexes <mailto:lgres@lgDashIndexes> =
>>> (/ 0, 0, 0, 0, 0, 0/)
>>> lgres@lgMarkerIndexes <mailto:lgres@lgMarkerIndexes> =
>>> (/ 0, 4, 16, 0, 0, 0/)
>>> lgres@lgMarkerColors <mailto:lgres@lgMarkerColors> =
>>> (/"White", "Black" , "Black"/)
>>> lgres@lgMarkerSizes <mailto:lgres@lgMarkerSizes> = (/
>>> 0.0001, 0.004, 0.004/)
>>> gsn_legend_ndc(wks,5,(/"Tropical Cyclone No.","1200 UTC
>>> Position/Date","0000 UTC Position",\
>>> "Tropical Dep.","Tropical Storm
>>> (T)","Hurricane (H)"/),xlegend,ylegend,lgres) yoffset_day =
>>> -0.0750 ; offsets for the case where we don't plot all the extra
>>> cases
>>> yoffset_storm = -0.0875
>>> end if
>>>
>>> ; Now draw a day label on the legend
>>> txres@txPerimOn <mailto:txres@txPerimOn> = False
>>> txres@txFontHeightF <mailto:txres@txFontHeightF> = 0.0022
>>> txres@txPerimSpaceF <mailto:txres@txPerimSpaceF> = 0.0
>>> txres@txJust <mailto:txres@txJust> =
>>> "CenterCenter"
>>> txres@gsnDraw <mailto:txres@gsnDraw> = False
>>> ;
>>> ; Note: the X and Y positions in this case don't matter, because the
>>> ; text will get repositioned in the "gsn_add_anotation" function.
>>> ;
>>> number_text = gsn_create_text(wks,"21",txres)
>>> ; Draw storm number on the legend txres@txFontHeightF
>>> <mailto:txres@txFontHeightF> = 0.0028
>>> txres@txPerimOn <mailto:txres@txPerimOn> = True
>>> txres@txPerimColor <mailto:txres@txPerimColor> = "Black"
>>> txres@txPerimThicknessF <mailto:txres@txPerimThicknessF> =
>>> 1.0
>>> txres@txPerimSpaceF <mailto:txres@txPerimSpaceF> = 0.4
>>> txres@txBackgroundFillColor
>>> <mailto:txres@txBackgroundFillColor> = "White"
>>> three_text = gsn_create_text(wks,"3",txres) ;
>>> ; Add the various text and legend annotations to the plot.
>>> ;
>>> amres@amParallelPosF <mailto:amres@amParallelPosF> = -0.13
>>> amres@amOrthogonalPosF <mailto:amres@amOrthogonalPosF> = -0.48
>>> amres@amJust <mailto:amres@amJust> = "TopCenter"
>>> txid4 = gsn_add_annotation(plot,atlantic_text,amres)
>>> amres@amParallelPosF <mailto:amres@amParallelPosF> = 0.383
>>> amres@amOrthogonalPosF <mailto:amres@amOrthogonalPosF> = 0.470
>>> amres@amJust <mailto:amres@amJust> = "BottomRight"
>>> txid5 = gsn_add_annotation(plot,number_text,amres)
>>> amres@amParallelPosF <mailto:amres@amParallelPosF> = 0.3815
>>> amres@amOrthogonalPosF <mailto:amres@amOrthogonalPosF> = 0.479
>>> amres@amJust <mailto:amres@amJust> = "BottomRight"
>>> txid6 = gsn_add_annotation(plot,three_text,amres)
>>> amres@amParallelPosF <mailto:amres@amParallelPosF> = 0.49
>>> amres@amOrthogonalPosF <mailto:amres@amOrthogonalPosF> = 0.49
>>> amres@amJust <mailto:amres@amJust> = "BottomRight"
>>> annoid1 = gsn_add_annotation(plot,legend,amres)
>>> amres@amJust <mailto:amres@amJust> = "BottomCenter"
>>> amres@amParallelPosF <mailto:amres@amParallelPosF> = 0.00
>>> amres@amOrthogonalPosF <mailto:amres@amOrthogonalPosF> = 0.49
>>> annoid2 = gsn_add_annotation(plot,lambert_text,amres)
>>> draw(plot)
>>> frame(wks)
>>>
>>> end
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> Yahoo!香港提供網上安全攻略,教你如何防範黑客!*了解更多*
>>> <http://hk.promo.yahoo.com/security/>
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>>
>>> _______________________________________________
>>> ncl-talk mailing list
>>> List instructions, subscriber options, unsubscribe:
>>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> ncl-talk mailing list
>> List instructions, subscriber options, unsubscribe:
>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>
>
> -----內含下列附件-----
>
> ;********************************************************
> ; track_one.ncl
> ;
> ; Author: Jonathan Vigh (with assistance from Mary Haley)
> ; Location: Colorado State University
> ;
> ;
> ; The purpose of this script is to plot the best track
> ; for jut one storm including all data (subtropical
> ; storms, depressions, extrtropical lows, etc.)
> ;
> ; For future work - fix up annotations with new NCL annotation
> functionality.
> ; ALSO, see about controlling the lat/lon tickmark spacing using
> ; a resource like gsnMajorLatSpacing.
> ;
> ;********************************************************
> 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/csm/shea_util.ncl"
>
> begin
>
> fili = "BAL131998.DAT"
> name = "Mitch"
> ssn = "13"
>
> ; Next, set the plotting parameters (which cases to plot)
> TypeOn = True ; If you just want the legend
> to have the basic (H, TS, and TD) designators (* and S), set TypeOn
> to False
> ; NOTE -- this will cause the program to grab
> a different input file -- one in which all the
> ; extratropical (E), remnant low (L), and wave
> cases (W) have been taken out; additionally,
> ; there will not be a distinction between the
> S and * cases (they will just be plotted according to
> ; intensity
>
> PlotSubTropicalSegments = True ; If you wish to exclude all
> subtropical line segments, set to False
>
> ; Note: if TypeOn is set to False, the following (W, L, E) cases
> won't be plotted regardless of their value
> PlotWaveSegments = True ; If you wish to exclude all
> wave segments, set to False
> PlotLowSegments = True ; If you wish to exclude all
> remnant low segments, set to False
> PlotExtraTropicalSegments = True ; If you wish to exclude all
> extratropical line sements, set to False
>
>
>
> ;********************************
> ; get data
> ;********************************
> tStr = asciiread(fili, -1,"string") ; Info includes type so
> cases can be weeded out
>
> tChr = stringtochar(tStr)
>
> nrows = dimsizes(tStr)
>
>
> sn = stringtoint( chartostring(tChr(:,0:1)) )
> year = stringtoint( chartostring(tChr(:,2:3)) )
> month = stringtoint( chartostring(tChr(:,4:5)) )
> day = stringtoint( chartostring(tChr(:,6:7)) )
> hour = stringtoint( chartostring(tChr(:,8:9)) )
>
> lat = stringtofloat( chartostring(tChr(:,10:13)) )/10.0
> lon = -stringtofloat( chartostring(tChr(:,15:18)) )/10.0
> vmax = stringtoint( chartostring(tChr(:,21:23)) )
>
> type = chartostring(tChr(:,30:30))
>
> ; Now create arrays that only hold the points for the 00z locations
> lat0 = mask(lat,hour,0)
> lon0 = mask(lon,hour,0)
>
> lat12 = mask(lat,hour,12)
> lon12 = mask(lon,hour,12)
> day12 = mask(day,hour,12)
>
>
> ;********************************
> ; select sub-regions
> ;********************************
> minlat = 5.0 ;min(lat) ; 0.0 ; deg N ; was 0
> maxlat = 30.0 ;max(lat) ; 57.0 ; deg N ; was 57
> minlon = -95.0 ; min(lon) -.;-100.0 ; - deg E = deg W ;
> was -100
> maxlon = -70.0 ; max(lon) +10.; -10.0 ; - deg E = deg W
> ; was -20, then -15
>
> ;***** Define some NICE color maps to use.
> colors_8 =
> (/"White","Black","Black","MediumPurple1","MediumPurple3","Blue1",\
> "CadetBlue3","Aquamarine2", \
> "Gold","Tan1","Sienna1","Tomato","VioletRed1", \
> "Yellow","LimeGreen","Grey37","Red","Orange","GoldenRod1", \
> "DarkOrange","SteelBlue1","SlateBlue1","SlateGray1", \
> "LightSlateBlue","Magenta","DodgerBlue", \
> "LightSteelBlue1","Moccasin","LightYellow","LemonChiffon1", \
> "CornSilk","LightGoldenrodYellow","Tan","PaleTurquoise3"/)
>
>
> ;********************************
> ; create plot
> ;********************************
> wks = gsn_open_wks("eps",name)
>
> gsn_define_colormap(wks,colors_8)
>
> res = True
>
> ; res@gsnMaximize = True
> res@gsnDraw = False ; so we can add poly stuff
> res@gsnFrame = False ; do not advance frame
>
> res@gsnMaximize = True
>
> ; res@gsnPaperOrientation = "portrait"
>
> res@mpDataBaseVersion = "Ncarg4_1" ; Alias 'MediumRes'
> res@mpDataSetName = "Earth..1"
> ; res@mpProjection = "LambertConformal"
>
> res@mpLambertParallel1F = 20.0
> res@mpLambertParallel2F = 40.0
> res@mpLambertMeridianF = -60.0
>
> res@mpLimitMode = "LatLon"
>
> res@mpMinLatF = minlat
> res@mpMaxLatF = maxlat
> res@mpMinLonF = minlon
> res@mpMaxLonF = maxlon
>
> res@mpFillOn = True ; False to turn off gray continents
> res@mpOutlineOn = True ; turn on continental outline
> res@mpOutlineBoundarySets = "AllBoundaries"
>
> res@mpLandFillColor = "Tan" ; was "GoldenRod1"
> res@mpInlandWaterFillColor = "PaleTurquoise3" ; was
> "LightBlue1" ; was "PaleTurquoise3"
> res@mpOceanFillColor = "PaleTurquoise3" ; was "LightBlue1"
>
> res@mpGeophysicalLineColor = "Grey37"
> res@mpGeophysicalLineThicknessF = 0.5
>
> res@mpUSStateLineColor = "Grey37"
> res@mpUSStateLineThicknessF = 0.5
>
> res@mpNationalLineColor = "Grey37"
> res@mpNationalLineThicknessF = 0.5
>
> res@mpGridAndLimbOn = "True"
> res@mpGridAndLimbDrawOrder = "Draw"
> res@mpGridMaskMode = "MaskLand"
> res@mpGridSpacingF = 5.0
> res@mpGridLineColor = "Grey37"
>
> res@tmXBLabelFontHeightF = 0.012 ; 0.005
> res@tmXBMajorLengthF = -0.001
>
> res@pmTickMarkDisplayMode = "Always"
>
> ; res@tiMainString = "Hurricane Wilma (2005)"
>
> ;***************************************
> ; plot base map *
> ;***************************************
>
> plot = gsn_csm_map(wks,res) ; draw one of eight map
> projections
>
>
> ;***************************************
> ; Draw best track history as polylines *
> ;***************************************
> res_poly = True ; polyline mods desired
>
> ; create array of dummy graphic variables. This is required, b/c
> each line
> ; must be associated with a unique dummy variable.
>
> dum = new(dimsizes(hour),graphic)
>
> ic = 0
> do k=0,nrows-2
>
> if(.not.ismissing(lat(k)))
>
> res_poly@gsLineDashPattern = 0
> res_poly@gsLineThicknessF = 4
>
> if(.not. TypeOn) then
>
> ; Plot hurricane segments
> if((vmax(k).gt.64).and.(type(k).eq."*")) then
> res_poly@gsLineColor = "Red"
>
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
>
> ; Plot tropical storm segments
>
> if((vmax(k).lt.64).and.(vmax(k).gt.34).and.(type(k).eq."*")) then
> res_poly@gsLineColor = "Yellow"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
>
> ; Plot tropical depression segments
> if((vmax(k).lt.34).and.(type(k).eq."*")) then
> res_poly@gsLineColor = "LimeGreen"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
>
> ; Now plot the subtropical segments with dashed lines
>
> ; Plot hurricane segments of subtropical systems with dashed red lines
> if((vmax(k).gt.64).and.(type(k).eq."S")) then
> res_poly@gsLineColor = "Red"
>
> res_poly@gsLineDashPattern = 2
> res_poly@gsLineDashSegLenF = 0.1
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
>
> ; Plot tropical storm segments of subtropical systems with dashed
> yellow lines
>
> if((vmax(k).lt.64).and.(vmax(k).gt.34).and.(type(k).eq."S")) then
> res_poly@gsLineColor = "Yellow"
> res_poly@gsLineDashPattern = 2
> res_poly@gsLineDashSegLenF = 0.1
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
>
> ; Plot tropical depression segments of subtropical systems with
> dashed dark LimeGreen lines
> if((vmax(k).lt.34).and.(type(k).eq."S")) then
> res_poly@gsLineColor = "LimeGreen"
> res_poly@gsLineDashPattern = 2
> res_poly@gsLineDashSegLenF = 0.1
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
>
> else ; if(TypeOn) -- plot pure tropical segments as solid lines
> (red for hurricane, etc.).
>
> ; Plot hurricane segments
> if((vmax(k).gt.64).and.(type(k).eq."*")) then
> res_poly@gsLineColor = "Red"
>
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
>
> ; Plot tropical storm segments
>
> if((vmax(k).lt.64).and.(vmax(k).gt.34).and.(type(k).eq."*")) then
> res_poly@gsLineColor = "Yellow"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
>
> ; Plot tropical depression segments
> if((vmax(k).lt.34).and.(type(k).eq."*")) then
> res_poly@gsLineColor = "LimeGreen"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
>
> if(PlotWaveSegments) then
>
> ; Plot tropical wave segments
> if(type(k).eq."W") then
> res_poly@gsLineColor = "LimeGreen"
> res_poly@gsLineDashPattern = 2
> res_poly@gsLineDashSegLenF = 0.1
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> end if
>
>
> if(PlotLowSegments) then
>
> ; Plot remanant low segments
> if(type(k).eq."L") then
> res_poly@gsLineColor = "SlateBlue"
> res_poly@gsLineDashPattern = 2
> res_poly@gsLineDashSegLenF = 0.1
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> end if
>
>
> if(PlotSubTropicalSegments) then
>
> ; Plot subtropical storm segments
> if((vmax(k).gt.34).and.(type(k).eq."S")) then
> res_poly@gsLineColor = "DarkOrange"
>
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
>
> ; Plot subtropical depression segments
> if((vmax(k).lt.34).and.(type(k).eq."S")) then
> res_poly@gsLineColor = "Blue1"
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
>
> end if
>
>
> if(PlotExtraTropicalSegments) then
>
> ; Plot extratropical segments
> if(type(k).eq."E") then
> res_poly@gsLineColor = "Black"
> res_poly@gsLineDashPattern = 2
> res_poly@gsLineDashSegLenF = 0.1
> dum(ic) =
> gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
> ic = ic + 1
> end if
> end if
> end if
>
> end if
>
> end do
>
>
> ;***************************************
> ; Draw black dots at lat/lon itersections
> ;***************************************
>
>
> ;***************************************
> ; Draw black polymarkers at 00Z locations
> ;***************************************
> res_mark = True
>
> res_mark@gsMarkerIndex = 1 ; polymarker style
> res_mark@gsMarkerSizeF = 0.02 ; polymarker size - was 0.012
> res_mark@gsMarkerColor = "Black" ; change marker color
>
> duma = new(1,graphic)
> duma = gsn_add_polymarker(wks,plot,lon0,lat0,res_mark)
>
>
> ; Now draw white polymarkers at 12z locations
> res_mark@gsMarkerIndex = 1
> res_mark@gsMarkerSizeF = 0.02 ; polymarker size - was 0.012
> res_mark@gsMarkerColor = "White" ; change marker color
>
>
> dumb = new(1,graphic)
> dumb = gsn_add_polymarker(wks,plot,lon12,lat12,res_mark)
>
>
> ;***************************
> ; Plot some text labels *
> ;***************************
> txres = True
>
> ; Now draw the day labels at each 00Z marker
> txres@txFontHeightF = 0.015 ; 0.008
> txres@txJust = "TopCenter"
>
> dumz = new(nrows,graphic)
>
> do k=0,nrows-1
> dumz(k) =
> gsn_add_text(wks,plot,day12(k),lon12(k),lat12(k)-0.25,txres)
> end do
>
> draw(wks)
>
>
> ; Draw storm number (actually these are strings) at beginning of
> track
> txres@txFontHeightF = 0.02 ; 0.0044
> txres@txJust = "CenterLeft"
>
> txres@txPerimOn = True
> txres@txPerimColor = "Black"
> txres@txPerimThicknessF = 1.0
> txres@txPerimSpaceF = 0.4
> txres@txBackgroundFillColor = "White"
>
> ; gsn_text(wks,plot,ssn,lon(0)+0.6,lat(0),txres)
>
>
> ; Now draw them at the end
> txres@txJust = "BottomRight"
> ; gsn_text(wks,plot,ssn,lon(nrows-1),lat(nrows-1),txres)
>
>
> if (.not. TypeOn) then
> txres@txFontHeightF = 0.02 ; 0.006
> txres@txJust = "CenterCenter"
> txres@txPerimSpaceF = 0.7
> txres@txPerimThicknessF = 1.5
> txres@txConstantSpacingF = 1.0
> txres@txFontAspectF = 1.5
> txres@txFontThicknessF = 0.8
> gsn_text_ndc(wks,"~F02~ Remnant low, tropical wave, and ~C~
> extratropical stages are not shown. ~C~~C~ Subtropical stages are
> dashed.",0.715,0.680,txres)
> end if
>
> txres@txFontHeightF = 0.005
> txres@txPerimThicknessF = 1.5
> txres@txPerimSpaceF = 1.0
> txres@txConstantSpacingF = 1.0
> txres@txFontAspectF = 1.5
> txres@txFontThicknessF = 0.8
>
>
> ;******************
> ; Plot a legend *
> ;******************
> lgres = False
>
> lgres@lgAutoManage = False
>
> lgres@vpWidthF = 0.2 ; was 0.1 ; width of
> legend (NDC)
> lgres@vpHeightF = 0.2 ; was 0.1 ; height of
> legend (NDC)
> ; lgres@lgBottomMarginF = 0.17 ; was 0.25
>
> lgres@lgPerimFill = 0 ; Use solid fill
> (0) instead of the default hollow fill
> lgres@lgPerimFillColor = "Background"
>
> ; lgres@lgBoxMajorExtentF = 0.4
> lgres@lgBoxMinorExtentF = 0.2 ; controls how wide the box
> holding the legend items (lines and markers) can be in relation to
> legend
>
> ; lgres@lgBoxBackground = "PaleTurquoise3"
>
> lgres@lgMonoItemType = False ; indicates that
> we wish to set the item types individually
> lgres@lgMonoMarkerIndex = False
> lgres@lgMonoLineThickness = False
> lgres@lgMonoMarkerThickness = False
> lgres@lgMonoMarkerSize = False
>
> ; position fine elements of legend relative to some positional values:
> xlegend = 0.66 ; 0.820
> ylegend = 0.35 ; 0.290
>
>
> if(TypeOn) then
>
> lgres@lgLabelFont = 0
> lgres@lgLabelFontHeightF = 0.012 ; 0.004
> lgres@lgLabelFontAspectF = 1.2
> lgres@lgLabelConstantSpacingF = 0.0
>
> lgres@lgItemCount = 11
> lgres@lgLineDashSegLenF = 0.1
> lgres@lgItemTypes =
> (/"Markers","Markers","Markers","Lines","Lines","Lines","Lines","Lines","Lines","Lines","Lines"/)
> lgres@lgMarkerIndexes = (/ 1, 4, 16,
> 0, 0, 0, 0, 0, 0, 0, 0/)
> lgres@lgLineThicknesses = (/ 0.1, 0.1, 0.1,
> 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0/)
> lgres@lgMarkerColors = (/ "White", "Black", "Black"/)
> lgres@lgMarkerSizes = (/ 0.0001, 0.004, 0.004/)
> lgres@lgLineColors = (/ "White", "Black", "Black",\
> "SlateBlue1", "LimeGreen",
> "Black", "Blue1", "Dark Orange",
> "LimeGreen", "Yellow", "Red" /) ; colors
> for legend lines
> lgres@lgDashIndexes = (/ 0, 0, 0,\
> 2, 2,
> 2, 0, 0, 0,
> 0, 0 /) ; dash indexes
>
> ; gsn_legend_ndc(wks,10, (/"Tropical Cyclone No.","1200 UTC
> Position/Date","0000 UTC Position",\
> ; "Remnant Low","Tropical
> Wave","Extratropical","Subtropical Dep.","Subtropical
> Storm","Tropical Dep.","Tropical Storm (T)","Hurricane
> (H)"/),xlegend,ylegend,lgres)
>
> yoffset_day = -0.0858
> yoffset_storm = -0.0910
>
> else
>
> lgres@lgLabelFont = 0
> lgres@lgLabelFontHeightF = 0.004
> lgres@lgLabelFontAspectF = 1.2
> lgres@lgLabelConstantSpacingF = 0..0
>
> lgres@lgItemCount = 6
> lgres@lgItemTypes =
> (/"Markers","Markers","Markers","Lines" ,"Lines" ,"Lines"/)
> lgres@lgLineColors = (/"White", "Black" ,"Black"
> ,"LimeGreen","Yellow","Red" /) ; colors for legend lines
> lgres@lgLineThicknesses = (/ 0.1, 0.1, 0.1,
> 4.0, 4.0, 4.0/)
> lgres@lgDashIndexes = (/ 0, 0, 0,
> 0, 0, 0/)
> lgres@lgMarkerIndexes = (/ 0, 4, 16,
> 0, 0, 0/)
> lgres@lgMarkerColors = (/"White", "Black" , "Black"/)
> lgres@lgMarkerSizes = (/ 0.0001, 0.004, 0.004/)
>
> ; gsn_legend_ndc(wks,5,(/"Tropical Cyclone No.","1200 UTC
> Position/Date","0000 UTC Position",\
> ; "Tropical Dep.","Tropical Storm
> (T)","Hurricane (H)"/),xlegend,ylegend,lgres)
>
> yoffset_day = -0..0750 ; offsets for the case where we don't
> plot all the extra cases
> yoffset_storm = -0.0875
>
> end if
>
> ; Now draw a day label on the legend
>
> txres@txPerimOn = False
> txres@txFontHeightF = 0.01
> txres@txPerimSpaceF = 0.0
> txres@txJust = "CenterCenter"
>
> ; gsn_text_ndc(wks,"21",xlegend + 0.0183, ylegend + yoffset_day,txres)
>
>
> ; Draw storm number on the legend
> txres@txFontHeightF = 0.004
>
> txres@txPerimOn = True
> txres@txPerimColor = "Black"
> txres@txPerimThicknessF = 1.0
> txres@txPerimSpaceF = 0.4
> txres@txBackgroundFillColor = "White"
>
> ; gsn_text_ndc(wks,"3",xlegend + 0.0142, ylegend +
> yoffset_storm,txres)
> ; drawNDCGrid(wks) ; Use to put on a grid for fine-tuning
> placement
>
> frame(wks)
>
> end
>
>
> ------------------------------------------------------------------------
> Yahoo!香港提供網上安全攻略,教你如何防範黑客!*了解更多*
> <http://hk.promo.yahoo.com/security/>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> ncl-talk mailing list
> List instructions, subscriber options, unsubscribe:
> http://mailman.ucar.edu/mailman/listinfo/ncl-talk

;********************************************************
; track_one.ncl
;
; Author: Jonathan Vigh (with assistance from Mary Haley)
; Location: Colorado State University
;
;
; The purpose of this script is to plot the best track
; for jut one storm including all data (subtropical
; storms, depressions, extrtropical lows, etc.)
;
; For future work - fix up annotations with new NCL annotation functionality.
; ALSO, see about controlling the lat/lon tickmark spacing using
; a resource like gsnMajorLatSpacing.
;
;********************************************************
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"

begin

   diri = "./"
   fili = "bwp122007.txt"
   
   cyclone_name = "Mitch"
   ssn = "13"

; Next, set the plotting parameters (which cases to plot)
   TypeOn = True ; If you just want the legend to have the basic (H, TS, and TD) designators (* and S), set TypeOn to False
                      ; NOTE -- this will cause the program to grab a different input file -- one in which all the
                      ; extratropical (E), remnant low (L), and wave cases (W) have been taken out; additionally,
                      ; there will not be a distinction between the S and * cases (they will just be plotted according to
                      ; intensity

   PlotSubTropicalSegments = True ; If you wish to exclude all subtropical line segments, set to False
   
; Note: if TypeOn is set to False, the following (W, L, E) cases won't be plotted regardless of their value
   PlotWaveSegments = True ; If you wish to exclude all wave segments, set to False
   PlotLowSegments = True ; If you wish to exclude all remnant low segments, set to False
   PlotExtraTropicalSegments = True ; If you wish to exclude all extratropical line sements, set to False


  
;********************************
; get data
;********************************
  data = asciiread(diri+fili, -1,"string") ; Info includes type so cases can be weeded out

;tStr = asciiread(fili, -1,"string") ; Info includes type so cases can be weeded out

  tChr = stringtochar(data)
        
  nrows = dimsizes(data)
  
  region = str_get_cols( data, 0, 1)
   print(region)

   year = str_get_cols( data, 8, 11) ; year,...hour are type "string"
   month = str_get_cols( data, 12, 13)
   day = str_get_cols( data, 14, 15)
   hour = str_get_cols( data, 16, 17)
   vmax = stringtoint( str_get_cols( data, 48, 50) )
   print (vmax)

   lat = stringtofloat(str_get_cols( data, 35, 37))*0.1
   ;if (str_get_cols( data, 38, 38).eq."S") then
   ; lat = -lat
   ;end if
   print(lat)

   lon = stringtofloat(str_get_cols( data, 41, 44))*0.1
   ;if (str_get_cols( data, 45, 45).eq."W") then
   ; lon = -lon
   ;end if
   print(lon)

   type = str_get_cols( data, 59, 60) ; "DB", "TD"
   name = str_get_cols( data,149,158)
   print(type+" "+name)

   ; Now create arrays that only hold the points for the 00z locations
  ind0 = ind(hour.eq."00")
  if (.not.ismissing(ind0(0))) then
      lat0 = lat(ind0)
      lon0 = lon(ind0)
  end if
  print("lat0="+lat0+" lon0="+lon0)
  
  ind12 = ind(hour.eq."12")
  if (.not.ismissing(ind12(0))) then
      lat12 = lat(ind12)
      lon12 = lon(ind12)
      day12 = day(ind12)
  end if
  print("lat12="+lat12+" lon12="+lon12+" day12="+day12)
 
;********************************
; select sub-regions
;********************************
     minlat = 5.0 ;min(lat) ; 0.0 ; deg N ; was 0
     maxlat = 40.0 ;max(lat) ; 57.0 ; deg N ; was 57
     minlon = 100.0 ; min(lon) -.;-100.0 ; - deg E = deg W ; was -100
     maxlon = 145.0 ; max(lon) +10.; -10.0 ; - deg E = deg W ; was -20, then -15

;***** Define some NICE color maps to use.
   colors_8 = (/"White","Black","Black","MediumPurple1","MediumPurple3","Blue1",\
          "CadetBlue3","Aquamarine2", \
          "Gold","Tan1","Sienna1","Tomato","VioletRed1", \
          "Yellow","LimeGreen","Grey37","Red","Orange","GoldenRod1", \
      "DarkOrange","SteelBlue1","SlateBlue1","SlateGray1", \
          "LightSlateBlue","Magenta","DodgerBlue", \
      "LightSteelBlue1","Moccasin","LightYellow","LemonChiffon1", \
      "CornSilk","LightGoldenrodYellow","Tan","PaleTurquoise3"/)

   
;********************************
; create plot
;********************************
   wks = gsn_open_wks("x11",cyclone_name)

   gsn_define_colormap(wks,colors_8)
   
   res = True

; res@gsnMaximize = True
   res@gsnDraw = False ; so we can add poly stuff
   res@gsnFrame = False ; do not advance frame

   res@gsnMaximize = True

; res@gsnPaperOrientation = "portrait"

   res@mpDataBaseVersion = "Ncarg4_1" ; Alias 'MediumRes'
   res@mpDataSetName = "Earth..1"
; res@mpProjection = "LambertConformal"
      
   res@mpLambertParallel1F = 20.0
   res@mpLambertParallel2F = 40.0
   res@mpLambertMeridianF = -60.0
   
   res@mpLimitMode = "LatLon"

   res@mpMinLatF = minlat
   res@mpMaxLatF = maxlat
   res@mpMinLonF = minlon
   res@mpMaxLonF = maxlon
  
   res@mpFillOn = True ; False to turn off gray continents
   res@mpOutlineOn = True ; turn on continental outline
   res@mpOutlineBoundarySets = "AllBoundaries"

   res@mpLandFillColor = "Tan" ; was "GoldenRod1"
   res@mpInlandWaterFillColor = "PaleTurquoise3" ; was "LightBlue1" ; was "PaleTurquoise3"
   res@mpOceanFillColor = "PaleTurquoise3" ; was "LightBlue1"

   res@mpGeophysicalLineColor = "Grey37"
   res@mpGeophysicalLineThicknessF = 0.5
   
   res@mpUSStateLineColor = "Grey37"
   res@mpUSStateLineThicknessF = 0.5
   
   res@mpNationalLineColor = "Grey37"
   res@mpNationalLineThicknessF = 0.5
   
   res@mpGridAndLimbOn = "True"
   res@mpGridAndLimbDrawOrder = "Draw"
   res@mpGridMaskMode = "MaskLand"
   res@mpGridSpacingF = 5.0
   res@mpGridLineColor = "Grey37"

   res@tmXBLabelFontHeightF = 0.012 ; 0.005
   res@tmXBMajorLengthF = -0.001

   res@pmTickMarkDisplayMode = "Always"
   
; res@tiMainString = "Hurricane Wilma (2005)"
    
;***************************************
; plot base map *
;***************************************

    plot = gsn_csm_map(wks,res) ; draw one of eight map projections

   
;***************************************
; Draw best track history as polylines *
;***************************************
   res_poly = True ; polyline mods desired

; create array of dummy graphic variables. This is required, b/c each line
; must be associated with a unique dummy variable.

  dum = new(dimsizes(hour),graphic)

  ic = 0
  do k=0,nrows-2

        if(.not.ismissing(lat(k)))

       res_poly@gsLineDashPattern = 0
           res_poly@gsLineThicknessF = 4

if(.not. TypeOn) then

; Plot hurricane segments
           if((vmax(k).gt.64).and.(type(k).eq."*")) then
              res_poly@gsLineColor = "Red"
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if

; Plot tropical storm segments
           if((vmax(k).lt.64).and.(vmax(k).gt.34).and.(type(k).eq."*")) then
              res_poly@gsLineColor = "Yellow"
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if

; Plot tropical depression segments
           if((vmax(k).lt.34).and.(type(k).eq."*")) then
              res_poly@gsLineColor = "LimeGreen"
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if

; Now plot the subtropical segments with dashed lines

; Plot hurricane segments of subtropical systems with dashed red lines
           if((vmax(k).gt.64).and.(type(k).eq."S")) then
              res_poly@gsLineColor = "Red"
          res_poly@gsLineDashPattern = 2
          res_poly@gsLineDashSegLenF = 0.1
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if

; Plot tropical storm segments of subtropical systems with dashed yellow lines
           if((vmax(k).lt.64).and.(vmax(k).gt.34).and.(type(k).eq."S")) then
              res_poly@gsLineColor = "Yellow"
          res_poly@gsLineDashPattern = 2
          res_poly@gsLineDashSegLenF = 0.1
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if

; Plot tropical depression segments of subtropical systems with dashed dark LimeGreen lines
           if((vmax(k).lt.34).and.(type(k).eq."S")) then
              res_poly@gsLineColor = "LimeGreen"
          res_poly@gsLineDashPattern = 2
          res_poly@gsLineDashSegLenF = 0.1
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if

else ; if(TypeOn) -- plot pure tropical segments as solid lines (red for hurricane, etc.).

; Plot hurricane segments
           if((vmax(k).gt.64).and.(type(k).eq."TY")) then
              res_poly@gsLineColor = "Red"
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if

; Plot tropical storm segments
           if((vmax(k).lt.64).and.(type(k).eq."TS").and.(vmax(k).gt.34)) then
              res_poly@gsLineColor = "Yellow"
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if

; Plot tropical depression segments
           if((vmax(k).lt.34).and.(type(k).eq."TD")) then
              res_poly@gsLineColor = "LimeGreen"
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
                   end if
                   
; Plot tropical disturbance segments
           if((type(k).eq."DB").and.(vmax(k).lt.34)) then
              res_poly@gsLineColor = "Purple"
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if

   if(PlotWaveSegments) then

; Plot tropical wave segments
           if(type(k).eq."WV") then
              res_poly@gsLineColor = "LimeGreen"
          res_poly@gsLineDashPattern = 2
          res_poly@gsLineDashSegLenF = 0.1
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if
   end if


   if(PlotLowSegments) then

; Plot remanant low segments
           if(type(k).eq."LO") then
              res_poly@gsLineColor = "SlateBlue"
          res_poly@gsLineDashPattern = 2
          res_poly@gsLineDashSegLenF = 0.1
          dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if
   end if
   

   if(PlotSubTropicalSegments) then
        
; Plot subtropical storm segments
           if((vmax(k).gt.34).and.(type(k).eq."SS")) then
              res_poly@gsLineColor = "DarkOrange"
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if

; Plot subtropical depression segments
           if((vmax(k).lt.34).and.(type(k).eq."SD")) then
              res_poly@gsLineColor = "Blue1"
              dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
              ic = ic + 1
           end if

   end if


   if(PlotExtraTropicalSegments) then

; Plot extratropical segments
      if(type(k).eq."EX") then
        res_poly@gsLineColor = "Black"
    res_poly@gsLineDashPattern = 2
    res_poly@gsLineDashSegLenF = 0.1
        dum(ic) = gsn_add_polyline(wks,plot,lon(k:k+1),lat(k:k+1),res_poly)
        ic = ic + 1
      end if
   end if
end if
    
    end if

   end do


;***************************************
; Draw black dots at lat/lon itersections
;***************************************
   

;***************************************
; Draw black polymarkers at 00Z locations
;***************************************
   res_mark = True

   res_mark@gsMarkerIndex = 1 ; polymarker style
   res_mark@gsMarkerSizeF = 0.02 ; polymarker size - was 0.012
   res_mark@gsMarkerColor = "Black" ; change marker color

   duma = new(1,graphic)
   duma = gsn_add_polymarker(wks,plot,lon0,lat0,res_mark)

   
; Now draw white polymarkers at 12z locations
   res_mark@gsMarkerIndex = 1
   res_mark@gsMarkerSizeF = 0.02 ; polymarker size - was 0.012
   res_mark@gsMarkerColor = "White" ; change marker color
      
   
   dumb = new(1,graphic)
   dumb = gsn_add_polymarker(wks,plot,lon12,lat12,res_mark)


;***************************
; Plot some text labels *
;***************************
   txres = True

; Now draw the day labels at each 00Z marker
   txres@txFontHeightF = 0.015 ; 0.008
   txres@txJust = "TopCenter"
   
   dumz = new(nrows,graphic)
  
   n12 = dimsizes(day12)
 ;;do k=0,nrows-1
   do k=0,n12-1
      dumz(k) = gsn_add_text(wks,plot,day12(k),lon12(k),lat12(k)-0.25,txres)
   end do

   draw(wks)


; Draw storm number (actually these are strings) at beginning of track
   txres@txFontHeightF = 0.02 ; 0.0044
   txres@txJust = "CenterLeft"
   
   txres@txPerimOn = True
   txres@txPerimColor = "Black"
   txres@txPerimThicknessF = 1.0
   txres@txPerimSpaceF = 0.4
   txres@txBackgroundFillColor = "White"

; gsn_text(wks,plot,ssn,lon(0)+0.6,lat(0),txres)


; Now draw them at the end
   txres@txJust = "BottomRight"
; gsn_text(wks,plot,ssn,lon(nrows-1),lat(nrows-1),txres)


if (.not. TypeOn) then
   txres@txFontHeightF = 0.02 ; 0.006
   txres@txJust = "CenterCenter"
   txres@txPerimSpaceF = 0.7
   txres@txPerimThicknessF = 1.5
   txres@txConstantSpacingF = 1.0
   txres@txFontAspectF = 1.5
   txres@txFontThicknessF = 0.8
   gsn_text_ndc(wks,"~F02~ Remnant low, tropical wave, and ~C~ extratropical stages are not shown. ~C~~C~ Subtropical stages are dashed.",0.715,0.680,txres)
end if

   txres@txFontHeightF = 0.005
   txres@txPerimThicknessF = 1.5
   txres@txPerimSpaceF = 1.0
   txres@txConstantSpacingF = 1.0
   txres@txFontAspectF = 1.5
   txres@txFontThicknessF = 0.8


;******************
; Plot a legend *
;******************
lgres = False

lgres@lgAutoManage = False
  
lgres@vpWidthF = 0.2 ; was 0.1 ; width of legend (NDC)
lgres@vpHeightF = 0.2 ; was 0.1 ; height of legend (NDC)
; lgres@lgBottomMarginF = 0.17 ; was 0.25

lgres@lgPerimFill = 0 ; Use solid fill (0) instead of the default hollow fill
lgres@lgPerimFillColor = "Background"

; lgres@lgBoxMajorExtentF = 0.4
lgres@lgBoxMinorExtentF = 0.2 ; controls how wide the box holding the legend items (lines and markers) can be in relation to legend

; lgres@lgBoxBackground = "PaleTurquoise3"

lgres@lgMonoItemType = False ; indicates that we wish to set the item types individually
lgres@lgMonoMarkerIndex = False
lgres@lgMonoLineThickness = False
lgres@lgMonoMarkerThickness = False
lgres@lgMonoMarkerSize = False

; position fine elements of legend relative to some positional values:
   xlegend = 0.66 ; 0.820
   ylegend = 0.35 ; 0.290


if(TypeOn) then

   lgres@lgLabelFont = 0
   lgres@lgLabelFontHeightF = 0.012 ; 0.004
   lgres@lgLabelFontAspectF = 1.2
   lgres@lgLabelConstantSpacingF = 0.0

   lgres@lgItemCount = 11
   lgres@lgLineDashSegLenF = 0.1
   lgres@lgItemTypes = (/"Markers","Markers","Markers","Lines","Lines","Lines","Lines","Lines","Lines","Lines","Lines"/)
   lgres@lgMarkerIndexes = (/ 1, 4, 16, 0, 0, 0, 0, 0, 0, 0, 0/)
   lgres@lgLineThicknesses = (/ 0.1, 0.1, 0.1, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0/)
   lgres@lgMarkerColors = (/ "White", "Black", "Black"/)
   lgres@lgMarkerSizes = (/ 0.0001, 0.004, 0.004/)
   lgres@lgLineColors = (/ "White", "Black", "Black",\
                                "SlateBlue1", "LimeGreen", "Black", "Blue1", "Dark Orange", "LimeGreen", "Yellow", "Red" /) ; colors for legend lines
   lgres@lgDashIndexes = (/ 0, 0, 0,\
                                     2, 2, 2, 0, 0, 0, 0, 0 /) ; dash indexes

; gsn_legend_ndc(wks,10, (/"Tropical Cyclone No.","1200 UTC Position/Date","0000 UTC Position",\
; "Remnant Low","Tropical Wave","Extratropical","Subtropical Dep.","Subtropical Storm","Tropical Dep.","Tropical Storm (T)","Hurricane (H)"/),xlegend,ylegend,lgres)

   yoffset_day = -0.0858
   yoffset_storm = -0.0910

else

   lgres@lgLabelFont = 0
   lgres@lgLabelFontHeightF = 0.004
   lgres@lgLabelFontAspectF = 1.2
   lgres@lgLabelConstantSpacingF = 0.0

   lgres@lgItemCount = 6
   lgres@lgItemTypes = (/"Markers","Markers","Markers","Lines" ,"Lines" ,"Lines"/)
   lgres@lgLineColors = (/"White", "Black" ,"Black" ,"LimeGreen","Yellow","Red" /) ; colors for legend lines
   lgres@lgLineThicknesses = (/ 0.1, 0.1, 0.1, 4.0, 4.0, 4.0/)
   lgres@lgDashIndexes = (/ 0, 0, 0, 0, 0, 0/)
   lgres@lgMarkerIndexes = (/ 0, 4, 16, 0, 0, 0/)
   lgres@lgMarkerColors = (/"White", "Black" , "Black"/)
   lgres@lgMarkerSizes = (/ 0.0001, 0.004, 0.004/)

; gsn_legend_ndc(wks,5,(/"Tropical Cyclone No.","1200 UTC Position/Date","0000 UTC Position",\
; "Tropical Dep.","Tropical Storm (T)","Hurricane (H)"/),xlegend,ylegend,lgres)

   yoffset_day = -0.0750 ; offsets for the case where we don't plot all the extra cases
   yoffset_storm = -0.0875

end if

; Now draw a day label on the legend

   txres@txPerimOn = False
   txres@txFontHeightF = 0.01
   txres@txPerimSpaceF = 0.0
   txres@txJust = "CenterCenter"

; gsn_text_ndc(wks,"21",xlegend + 0.0183, ylegend + yoffset_day,txres)


; Draw storm number on the legend
   txres@txFontHeightF = 0.004
   
   txres@txPerimOn = True
   txres@txPerimColor = "Black"
   txres@txPerimThicknessF = 1.0
   txres@txPerimSpaceF = 0.4
   txres@txBackgroundFillColor = "White"

; gsn_text_ndc(wks,"3",xlegend + 0.0142, ylegend + yoffset_storm,txres)
; drawNDCGrid(wks) ; Use to put on a grid for fine-tuning placement
   
   frame(wks)
  
end

_______________________________________________
ncl-talk mailing list
List instructions, subscriber options, unsubscribe:
http://mailman.ucar.edu/mailman/listinfo/ncl-talk
Received on Wed Nov 25 06:57:22 2009

This archive was generated by hypermail 2.1.8 : Sun Nov 29 2009 - 20:52:58 MST