;+ ; NAME: ; EP_TICKSD ; ; PURPOSE: ; This function can be used to create the axis labels for time related ; data plots. ; ; CATEGORY: ; Plotting Routines. ; ; CALLING SEQUENCE: ; Ticks = EP_TICKSD(Range, Tickvals, Ticknames, Minor, Exact) ; ; INPUTS: ; Range The time range in Epoch (milliseconds AD) format. ; ; KEYWORD PARAMETERS: ; Exact Set this keyword to suppress autoscaling. ; ; OUTPUTS: ; Tickvals An array of data values for each tick mark. ; ; Ticknames A string array containing the annotation of each ; tick mark. ; ; Minor The number of minor tick marks. ; ; COMMON BLOCKS: ; None. ; ; SIDE EFFECTS: ; None. ; ; PROCEDURE: ; ... ; ; create data arrays ; CDF_EPOCH, from, 1996, 1, 1, 6, /COMPUTE ; CDF_EPOCH, to, 1996, 1, 1, 18, /COMPUTE ; range = [from,to] ; xData = from + DBLARR(3601)*(to-from)/3600.0D ; yData = SIN(FINDGEN(3601)*!PI/180) ; ; ; get x-Axis tick marks ; ticks = EP_TICKSD(range, tickv, tickname, minor) ; ; ; plot data ; PLOT, xData-from, yData, XRANGE=range-from, XTICKS=ticks, ; XMINOR=minor, XTICKNAME=tickname, XTICKV=tickv-from ; ... ; ; MODIFICATION HISTORY: ; Written by: DI Harald Jan Jeszenszky, 01/96. ; 03/97 (HJJ) Extended to support time intervals including month ; and years. ; 05/97 (HJJ) Added minor tick marks. ; 12/98 (HJJ) Adjusted month and year intervals. ; 05/02 (HJJ) Fixed tick label bug when plotting EXACT time axis. ; Maximum major tick intervals increased to 6. ;- FUNCTION EP_TICKSD, dRange, dTickv, sTickv, nMinor, EXACT=isExact isExact = KEYWORD_SET(isExact) ;-------------------------------------------------------------------; ; error handling ; ;-------------------------------------------------------------------; CATCH, error IF (error NE 0) THEN BEGIN MESSAGE, !ERR_STRING, /CONTINUE RETURN, -1L ENDIF ;-------------------------------------------------------------------; ; define possible size and number of major tick intervals ; ;-------------------------------------------------------------------; dMsec = [1D, 2D, 5D, 10D, 20D, 25D, 50D, 100D, 250D, 500D] dSec = [1D, 2D, 5D, 10D, 15D, 20D, 30D] * 1000D * dMsec[0] dMin = [1D, 2D, 5D, 10D, 15D, 20D, 30D] * 60D * dSec[0] dHour = [1D, 2D, 3D, 4D, 6D, 8D, 12D] * 60D * dMin[0] ; dDay = [1D, 2D, 5D, 10D, 15D] * 24D * dHour[0] dDay = [1D, 2D, 4D, 7D, 14D] * 24D * dHour[0] dMonth = [1D, 2D, 3D, 4D, 6D] * 30.5D * dDay[0] dYear = [1D, 2D, 5D, 10D, 20D, 25D, 50D, 100D, 250D, 500D, 1000D] * $ 12D * dMonth[0] nMinor = [4, 4, 5, 5, 4, 5, 5, 5, 5, 5, $ 4, 4, 5, 5, 3, 4, 6, $ 6, 4, 5, 5, 3, 4, 6, $ 6, 4, 6, 4, 6, 4, 4, $ 4, 4, 5, 5, 5, $ 1, 2, 3, 4, 6, $ 12, 12, 5, 5, 5, 5, 5, 5, 5, 5, 5] dValid = [dMsec, dSec, dMin, dHour, dDay, dMonth, dYear] nElems = [10, 17, 24, 31, 36, 41, 52] ; nMinTicks = 2D ; minimal # of major tick intervals ; nMaxTicks = 6D ; maximal # of -"- nMinTicks = 4D ; minimal # of major tick intervals nMaxTicks = 12D ; maximal # of -"- ;-------------------------------------------------------------------; ; round data range to valid interval sizes ; ;-------------------------------------------------------------------; dMin = dRange(0) - (dRange(0) MOD dValid) dMax = dRange(1) - (dRange(1) MOD dValid) index = WHERE(dMax LT dRange(1), count) IF (count NE 0) THEN $ dMax(index) = dMax(index) + dValid(index) IF (dMin(0) EQ dMax(0)) THEN BEGIN dMax(0) = dMin(0) + 1D dRange(1) = dRange(0) + 1D ENDIF ;-------------------------------------------------------------------; ; determine number, size and unit of major tick intervals ; ;-------------------------------------------------------------------; ; nInter = (dMax - dMin)/dValid nInter = (dMax - dMin)/dValid nMin = MIN(nInter, MAX=nMax) CASE (1) OF nMax LT nMinTicks : $ index = 0L nMin GT nMaxTicks : $ index = N_ELEMENTS(dValid) - 1L ELSE : BEGIN index = WHERE((nInter GE nMinTicks)AND(nInter LE nMaxTicks)) dExtend = nInter(index)*dValid(index) - dMax(index) + dMin(index) index = (index(WHERE(dExtend EQ MIN(dExtend))))(0) END ENDCASE iUnit = (WHERE(index LT nElems))(0) dInter = dValid(index) nTicks = LONG(nInter(index)) ;-------------------------------------------------------------------; ; determine data range and tick values ; ;-------------------------------------------------------------------; CASE (iUnit) OF 5 : BEGIN CDF_EPOCH, dMin[index], yy, mm, /BREAK CDF_EPOCH, dTickv, yy, mm, /COMPUTE nTicks = 0L nMonth = LONG(dInter/dMonth[0]) mmAD = yy*12 + mm REPEAT BEGIN mmAD = mmAD + nMonth nTicks = nTicks + 1 yy = (mmAD - 1)/12 mm = mmAD - yy*12 CDF_EPOCH, epoch, yy, mm, /COMPUTE dTickv = [dTickv, epoch] ENDREP UNTIL (epoch GE dMax[0]) END 6 : BEGIN CDF_EPOCH, dMin[index], yy, /BREAK CDF_EPOCH, dTickv, yy, /COMPUTE nTicks = 0L nYears = LONG(dInter/dYear[0]) REPEAT BEGIN yy = yy + nYears nTicks = nTicks + 1 CDF_EPOCH, epoch, yy, /COMPUTE dTickv = [dTickv, epoch] ENDREP UNTIL (epoch GE dMax[0]) END ELSE : BEGIN dTickv = dMin(index) + DINDGEN(nTicks+1L)*dInter END ENDCASE IF (isExact) THEN BEGIN dRange = [dMin[0], dMax[0]] idx = WHERE((dTickv GT dRange(0))AND(dTickv LT dRange(1)), cnt) IF (cnt NE 0) THEN BEGIN idx = [idx(0)-1, idx, idx(cnt-1)+1] dTickv = dTickv(idx) nTicks = cnt + 1 ENDIF ENDIF ELSE $ dRange = [dTickv[0], dTickv[nTicks]] ;--------------------------------------------------------------------; ; determine number of minor tick intervals ; ;--------------------------------------------------------------------; nMinor = nMinor(index) IF (dTickv(0) NE dRange(0)) OR (dTickv(nTicks) NE dRange(1)) THEN $ nMinor = 1 ;-------------------------------------------------------------------; ; determine tick labels (sTickv) ; ;-------------------------------------------------------------------; sTickv = STRARR(nTicks+1) month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', $ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] FOR i = 0, nTicks DO BEGIN CDF_EPOCH, dTickv(i), yy, mm, dd, h, m, s, ms, /BREAK CASE (iUnit) OF 0 : sTickv(i) = STRING(h, m, s, ms, $ FORMAT='(I2.2,2(":",I2.2),".",I3.3)') 1 : sTickv(i) = STRING(h, m, s, FORMAT='(I2.2,2(":",I2.2))') 2 : sTickv(i) = STRING(h, m, FORMAT='(I2.2,":",I2.2)') 3 : sTickv(i) = STRING(h, FORMAT='(I2.2)') ; 4 : sTickv(i) = STRING(dd, FORMAT='(I0,".")') 4 : sTickv(i) = STRING(dd, FORMAT='(I0)') 5 : sTickv(i) = month(mm-1) 6 : sTickv(i) = STRING(yy, FORMAT='(I4.4)') ELSE : sTickv(i) = ' ' ENDCASE IF (i EQ 0) OR (i EQ nTicks) THEN BEGIN IF (dTickv(i) NE dRange(i/nTicks)) THEN BEGIN dTickv(i) = dRange(i/nTicks) CDF_EPOCH, dTickv(i), yy, mm, dd, h, m, ms, /BREAK sTickv(i) = ' ' ENDIF CASE (iUnit) OF 4 : sTickv(i) = sTickv(i) + $ STRING(month(mm-1), yy, FORMAT='("!C",A,I5.4)') 5 : sTickv(i) = sTickv(i) + STRING(yy, FORMAT='("!C",I4.4)') 6 : ; do nothing ELSE : $ sTickv(i) = sTickv(i) + "!C" + $ STRING(yy, mm, dd, FORMAT='(I4.4,2("-",I2.2))') ENDCASE ENDIF ENDFOR RETURN, nTicks END ; EP_TICKSD