;------------------------------------------------------------- ;+ ; NAME: ; VER ; PURPOSE: ; Plot a vertical line on a graph at specified x value. ; CATEGORY: ; CALLING SEQUENCE: ; ver, x ; INPUTS: ; x = X value of vertical line. Scalar or array. in ; KEYWORD PARAMETERS: ; Keywords: ; /DEVICE means work in device coordinates. ; /NORMALIZED means work in normalized coordinates. ; Default is data coordinates. ; LINESTYLE=s. Linestyle (def=!p.linestyle). ; COLOR=c. Line Color (def=!p.color). ; THICKNESS=thk Line thickness (def=!p.thick). ; FILL=clr Optional color to fill between line pairs. ; Fills between lines 0 and 1, 2 and 3, and so on. ; POINTER=pt Draw arrowhead pointers at top and bottom ; instead of lines. Arrowhead dimensions may be given as ; fraction of screen or plot window size, the value of ; pt is height, or [height, width]. For /pointer the ; default used is [.03,.03]. ; /BOTTOM used with POINTER to plot bottom pointers only. ; /TOP used with POINTER to plot top pointers only. ; /OUT Keep pointers outside axes (Data coord only). ; OUTPUTS: ; COMMON BLOCKS: ; NOTES: ; Note: see hor. ; MODIFICATION HISTORY: ; R. Sterner, 2 Aug, 1989. ; R. Sterner, 21 May, 1992 --- fixed for log Y axes. ; R. Sterner, 3 Nov, 1992 --- Added /device. ; R. Sterner, 27 Jan, 1993 --- dropped reference to array. ; R. Sterner 20 Jun, 1993 --- added /norm. ; R. Sterner 1994 Feb 2 --- Add THICK. ; R. Sterner, 1994 Jun 3 --- Added FILL. ; R. Sterner, 1994 Jun 16 --- Added POINTER. ; R. Sterner, 1997 Jul 11 --- Added /OUT. ; ; Copyright (C) 1989, Johns Hopkins University/Applied Physics Laboratory ; This software may be used, copied, or redistributed as long as it is not ; sold and this copyright notice is reproduced on each copy made. This ; routine is provided as is without any express or implied warranties ; whatsoever. Other limitations apply as described in the file disclaimer.txt. ;- ;------------------------------------------------------------- pro ver, x, help=hlp, device=device, linestyle=ls, color=clr, $ normalized=norm, thickness=thk, fill=fill, pointer=pt, $ top=top, bottom=bot, out=out if (n_params(0) lt 1) or keyword_set(hlp) then begin print,' Plot a vertical line on a graph at specified x value.' print,' ver, x' print,' x = X value of vertical line. Scalar or array. in' print,' Keywords:' print,' /DEVICE means work in device coordinates.' print,' /NORMALIZED means work in normalized coordinates.' print,' Default is data coordinates.' print,' LINESTYLE=s. Linestyle (def=!p.linestyle).' print,' COLOR=c. Line Color (def=!p.color).' print,' THICKNESS=thk Line thickness (def=!p.thick).' print,' FILL=clr Optional color to fill between line pairs.' print,' Fills between lines 0 and 1, 2 and 3, and so on.' print,' POINTER=pt Draw arrowhead pointers at top and bottom' print,' instead of lines. Arrowhead dimensions may be given as' print,' fraction of screen or plot window size, the value of' print,' pt is height, or [height, width]. For /pointer the' print,' default used is [.03,.03].' print,' /BOTTOM used with POINTER to plot bottom pointers only.' print,' /TOP used with POINTER to plot top pointers only.' print,' /OUT Keep pointers outside axes (Data coord only).' print,' Note: see hor.' return end xx = x n = n_elements(xx) if n_elements(ls) eq 0 then ls = !p.linestyle if n_elements(clr) eq 0 then clr = !p.color if n_elements(thk) eq 0 then thk = !p.thick ;------ Handle pointers ----------- if n_elements(pt) eq 0 then pt = 0 pflag = 0 if pt(0) gt 0 then begin if pt(0) eq 1 then pt=.03 ht = pt(0) wd = pt(n_elements(pt)-1) if n_elements(pt) eq 1 then wd = ht/2. pflag = 1 endif bflag=0 tflag=0 if keyword_set(bot) then bflag=1 if keyword_set(top) then tflag=1 if (bflag+tflag) eq 0 then begin bflag=1 tflag=1 endif ;-------- Device ------------ if keyword_set(device) then begin yy = [0,!d.y_size-1] for i = 0, n-1 do begin ;-------- Filled line pairs ----------- if n_elements(fill) ne 0 then begin if (i mod 2) eq 0 then begin x1 = xx(i) & x2 = xx((i+1)<(n-1)) y1 = yy(0) & y2 = yy(1) polyfill, /dev, [x1,x2,x2,x1],[y1,y1,y2,y2],color=fill endif ;--------- Single lines --------------- endif else if pflag eq 0 then begin plots,/device,[0,0]+xx(i),yy,linestyle=ls,color=clr,thick=thk ;--------- Pointers ------------------- endif else begin dx = round((!d.x_size-1)*wd/2.) dx = [-dx,0,dx]+xx(i) dy = round((!d.y_size-1)*ht) y1 = [0,dy,0] y2 = !d.y_size-1 - [0,dy,0] if bflag then polyfill,/dev,dx,y1,col=clr if tflag then polyfill,/dev,dx,y2,col=clr endelse endfor ;--------- Normalized ---------- endif else if keyword_set(norm) then begin yy = [0,1] for i = 0, n-1 do begin ;-------- Filled line pairs ----------- if n_elements(fill) ne 0 then begin if (i mod 2) eq 0 then begin x1 = xx(i) & x2 = xx((i+1)<(n-1)) y1 = yy(0) & y2 = yy(1) polyfill, /norm, [x1,x2,x2,x1],[y1,y1,y2,y2],color=fill endif ;--------- Single lines --------------- endif else if pflag eq 0 then begin plots,/norm,[0,0]+xx(i),yy,linestyle=ls,color=clr,thick=thk ;--------- Pointers ------------------- endif else begin dx = wd/2. dx = [-dx,0,dx]+xx(i) dy = ht y1 = [0,dy,0] y2 = [1,1-dy,1] if bflag then polyfill,/norm,dx,y1,col=clr if tflag then polyfill,/norm,dx,y2,col=clr endelse endfor ;---------- Data ------------- endif else begin yy = [!y.range, !y.crange] for i = 0, n-1 do begin ;-------- Linear Y axis ---------- if !y.type eq 0 then begin ;-------- Filled line pairs ----------- if n_elements(fill) ne 0 then begin if (i mod 2) eq 0 then begin x1 = xx(i) & x2 = xx((i+1)<(n-1)) y1 = min(yy) & y2 = max(yy) polyfill, [x1,x2,x2,x1],[y1,y1,y2,y2],color=fill,noclip=0 endif ;--------- Single lines --------------- endif else if pflag eq 0 then begin oplot,[1.,1.]*xx(i),[min(yy),max(yy)],linestyle=ls,$ color=clr, thick=thk ;--------- Pointers ------------------- endif else begin dx = (!x.crange(1)-!x.crange(0))*wd/2. if !x.type eq 0 then dx=[-dx,0,dx]+xx(i) else $ dx=10^([-dx,0,dx]+alog10(xx(i))) dy = (!y.crange(1)-!y.crange(0))*ht y1 = [0,dy,0]+!y.crange(0) y2 = [0,-dy,0]+!y.crange(1) if keyword_set(out) then begin y1 = y1-dy y2 = y2+dy endif if bflag then polyfill,dx,y1,col=clr if tflag then polyfill,dx,y2,col=clr endelse ;-------- Log Y axis ---------- endif else begin ;-------- Filled line pairs ----------- if n_elements(fill) ne 0 then begin if (i mod 2) eq 0 then begin x1 = xx(i) & x2 = xx((i+1)<(n-1)) y1 = min(yy) & y2 = max(yy) polyfill, [x1,x2,x2,x1],10^[y1,y1,y2,y2],color=fill,noclip=0 endif ;--------- Single lines --------------- endif else if pflag eq 0 then begin oplot,[1.,1.]*xx(i),10^[min(yy),max(yy)],linestyle=ls,$ color=clr, thick=thk ;--------- Pointers ------------------- endif else begin dx = (!x.crange(1)-!x.crange(0))*wd/2. if !x.type eq 0 then dx=[-dx,0,dx]+xx(i) else $ dx=10^([-dx,0,dx]+alog10(xx(i))) dy = (!y.crange(1)-!y.crange(0))*ht y1 = 10^([0,dy,0]+!y.crange(0)) y2 = 10^([0,-dy,0]+!y.crange(1)) if keyword_set(out) then begin y1 = 10^([0,dy,0]-dy+!y.crange(0)) y2 = 10^([0,-dy,0]+dy+!y.crange(1)) endif if bflag then polyfill,dx,y1,col=clr if tflag then polyfill,dx,y2,col=clr endelse endelse ; !y.type. endfor endelse return end