;+ ; NAME: ; spp_fld_statusplot ; ; PROCEDURE: ; spp_fld_statusplot, x, y, overplot = overplot, limits = lim, data = data ; ; INPUT: ; x: array of x values. ; y: array of y strings. ; ; PURPOSE: ; Procedure used to display status bars on a TPLOT. ; SPP_FLD_STATUSPLOT uses the SPECPLOT routine to plot a TPLOT variable ; that can take on one of several discrete STRING values. ; ; KEYWORDS: ; DATA: A structure containing the elements 'x' and 'y'. ; LIMITS: The limits structure for the TPLOT variable. ; OVERPLOT: If set, data is plotted over current plot. ; STAT_VALS: An array of strings containing possible ; values for the 'y' variable. If STAT_VALS is unset, ; STATUSPLOT plots status bars for each unique ; string contained in the 'y' variable. ; ; EXAMPLE: ; If 'Channel' is a TPLOT variable with possible values of ; 'Ch1', 'Ch2', and 'Off', then the following commands ; will set up statusplot. ; ; options, 'Channel', 'tplot_routine', 'statusplot' ; options, 'Channel', 'stat_vals', ['Off', 'Ch1', 'Ch2'] ; tplot, 'Channel' ; ; MOD HISTORY: ; Original version, based on the STRPLOT procedure, ; created 27 May 2009 by Marc Pulupa. ;- pro spp_fld_statusplot, x, y, overplot = overplot, $ limits = lim, data = data, stat_vals = stat_vals if keyword_set(data) then begin x = data.x y = data.y extract_tags, stuff, data, except=['x','y'] endif extract_tags, stuff, lim extract_tags, plotstuff, stuff, /plot extract_tags, xyoutstuff, stuff, /xyout labsize = 1. str_element, stuff, 'labsize', val = labsize chsize = !P.CHARSIZE if not keyword_set(chsize) then chsize = 1. if not keyword_set(stat_vals) then begin extract_tags, stat_vals_str, stuff, tags = ['stat_vals'] if keyword_set(stat_vals_str) then stat_vals = stat_vals_str.stat_vals end if keyword_set(stat_vals) then $ y_vals = stat_vals else $ y_vals = strcompress(string(y[uniq(y, sort(y))])) n_x = n_elements(x) n_y = n_elements(y_vals) IF n_y GT 59 then begin PRINT, 'STATUSPLOT Error: Too many (>60) unique y values.' END IF !P.BACKGROUND GT !P.COLOR THEN BEGIN background = 1. foreground = 0. ENDIF ELSE BEGIN background = 0. foreground = 1. END z = fltarr(n_x, 2*n_y)+background for i = 0l, n_x-1 do begin status_index = where(y_vals EQ y[i]) if status_index[0] GT -1 then begin z[i, 2*where(y_vals EQ y[i])] = foreground z[i, 2*where(y_vals EQ y[i])+1] = foreground end end delta = 0.00001 y_spec_bottom = findgen(n_y)/n_y y_spec_top = y_spec_bottom+1./n_y-delta y_spec0 = [y_spec_bottom, y_spec_top] y_spec = y_spec0[sort(y_spec0)] yticks = n_elements(y_vals)+1 ytickname = [' ', y_vals, ' '] yticknamelen = fltarr(n_elements(ytickname)) ytickv = [0., (0.5+findgen(n_y))/n_y, 1.] for i = 0, n_elements(ytickname) -1 do yticknamelen[i] = strlen(ytickname[i]) str_element, plotstuff, 'ytitle', val = ytitle cs = 1.0 tplot_options, get_options = opt str_element, opt, 'charsize', cs blankyticks = [strmid(string(make_array(1,/string),format='(A20)'), $ 0, max(yticknamelen) + 3 < 20), ' '] if not keyword_set(overplot) then $ plot, /nodata, x, findgen(n_x)/n_x, $ yrange = [0, 1], ystyle = 1, ytitle = ytitle, $ yticks = 1, $ ytickname = blankyticks, $ _extra = plotstuff specplot, x, y_spec, z, $ limits = {x_no_interp:1, y_no_interp:1, $ no_color_scale:1, xstyle:4, yticklen:-0.000001, $ yminor:1, yticks:yticks, $ ytickname:ytickname, ycharsize:cs, $ ytickv:ytickv, overplot:1, zrange:[0., 1.], $ bottom:0b, top:255b} if not keyword_set(overplot) then $ plot, /noerase, /nodata, x, findgen(n_x)/n_x, $ ystyle = 4, $ _extra = plotstuff end