;+
;NAME: tplot_positions
;PURPOSE:
; Return a set of plot positions for tplot.
; Given the number of plots, the margins, and the relative
; sizes of the plot panels, determine the plot coordinates.
; The positions are the device coordinates of the plot, not
; of the plot region. (See IDL User's Guide Chapter 14.10)
;
; If the margins are not specifically set, first the limit
; structures are checked, then ![x,y].margin are checked,
; then some defaults are used.
;
;CALLING SEQUENCE: positions = tplot_positions(panels)
;
;INPUTS: panels: the number of plots, an integer
;
;KEYWORD PARAMETERS: xm,xom,ym,yom: the x and y inner and outer margins
; these are two element arrays. ![x,y].margin
; and ![x,y].omargin are used if left off
; sizes: fltarr(panels) containing the relative plot sizes
;
;OUTPUTS: positions = fltarr(4,n_elements(panels))
; positions(*,i) is the ith plot position
; (x0,y0,x1,y1)
;EXAMPLE:
;
;LAST MODIFICATION: @(#)tplot_positions.pro 1.2 97/05/30
;-
FUNCTION tplot_positions,panels,xm=xm,xom=xom,ym=ym,yom=yom,sizes=sizes
@tplot_com
str_element,tplot_vars,'names',tplot_var
;;see if tplot_var is useful
n_t_var = n_elements(tplot_var)
;;check input values and set defaults
IF data_type(panels) EQ 0 THEN panels = n_elements(tplot_var) > 1 $
ELSE panels = fix(panels)
IF NOT keyword_set(xm) THEN xm = !x.margin
IF NOT keyword_set(xom) THEN xom = !x.omargin
IF NOT keyword_set(ym) THEN ym = !y.margin
IF NOT keyword_set(yom) THEN yom = !y.omargin
IF NOT keyword_set(sizes) THEN sizes = make_array(panels,/float,value=1.0) $
ELSE sizes = reverse(sizes)
;;get character scale factors to margins
IF !p.charsize EQ 0 THEN pc = 1.0 ELSE pc = !p.charsize
IF !x.charsize EQ 0 THEN xc = 1.0 ELSE xc = !x.charsize
IF !y.charsize EQ 0 THEN yc = 1.0 ELSE yc = !y.charsize
;;create arrays to hold margins and scale factors for each panel
t_pc = make_array(panels, /float,value=0) ;charsize
; t_ps = make_array(4,panels,/float,value=0) ;position ;for now, i ignore this
t_xc = make_array(panels, /float,value=0) ;xcharsize
t_xm = make_array(2,panels,/float,value=0) ;xmargin
t_yc = make_array(panels, /float,value=0) ;ycharsize
t_ym = make_array(2,panels,/float,value=0) ;ymargin
;;check the limit structures for tags that affect plot positioning
;;if the tags do not exist, use the input values, or default values
IF n_t_var GT 0 THEN vars = reverse(tplot_var) ;get handle names, bottom up
FOR i=0,panels-1 DO BEGIN
t_pc(i) = pc ;set defaults
; t_ps(*,i) = [0,0,0,0]
t_xc(i) = xc
t_xm(*,i) = xm
t_yc(i) = yc
t_ym(*,i) = ym
IF n_t_var GT 0 THEN BEGIN
get_data,vars(i),lim=t_lm ;get limit structure
IF data_type(t_lm) EQ 8 THEN BEGIN
str_element,t_lm,'charsize', value=val,index=ind
IF (ind GE 0) and (data_type(val) GT 0) THEN t_pc(*,i) = val
; str_element,t_lm,'position', value=val,index=ind ;again, ignoring this
; IF (ind GE 0) and (data_type(val) GT 0) THEN t_ps(*,i) = val
str_element,t_lm,'xcharsize',value=val,index=ind
IF (ind GE 0) and (data_type(val) GT 0) THEN t_xc(*,i) = val
str_element,t_lm,'xmargin', value=val,index=ind
IF (ind GE 0) and (data_type(val) GT 0) THEN t_xm(*,i) = val
str_element,t_lm,'ycharsize',value=val,index=ind
IF (ind GE 0) and (data_type(val) GT 0) THEN t_yc(*,i) = val
str_element,t_lm,'ymargin', value=val,index=ind
IF (ind GE 0) and (data_type(val) GT 0) THEN t_ym(*,i) = val
ENDIF
ENDIF
ENDFOR
;;change the margins variables from character units to device units
FOR i=0,panels-1 DO BEGIN
t_xm(*,i) = t_xm(*,i) * t_xc(i) * t_pc(i) * !d.x_ch_size
t_ym(*,i) = t_ym(*,i) * t_yc(i) * t_pc(i) * !d.y_ch_size
ENDFOR
xom = xom * xc * pc * !d.x_ch_size
yom = yom * yc * pc * !d.y_ch_size
;;set plot area to total window
xtotpltlen = !d.x_size
ytotpltlen = !d.y_size
;;remove outter margins
xtotpltlen = xtotpltlen - total(xom)
ytotpltlen = ytotpltlen - total(yom)
;;remove inner margins
; xtotpltlen = xtotpltlen - total(t_xm)
ytotpltlen = ytotpltlen - total(t_ym)
;;divide up the plot space
xpltlen = make_array(panels,/float,value=xtotpltlen) - t_xm(0,*) - t_xm(1,*)
ypltlen = ytotpltlen*sizes/total(sizes)
;;create y position arrays
y0 = fltarr(panels)
y1 = y0
;;determine the x plot positions for all of the plots
x0 = xom(0) + t_xm(0,*)
x1 = x0 + xpltlen
;;determine the y plot positions for the base plot
y0(0) = yom(0) + t_ym(0,0)
y1(0) = y0(0) + ypltlen(0)
;;Determine the y plot positions of the rest of the plots
FOR i=1,panels-1 DO BEGIN
y0(i) = y1(i-1) + t_ym(1,i-1) ;start at top margin of previous plot
y0(i) = y0(i) + t_ym(0,i) ;add margin for current (ith) plot
y1(i) = y0(i) + ypltlen(i) ;add ith plot height to ith plot base
ENDFOR
;;create a 2d array of positions
positions = make_array(4,panels,value=0,/float)
positions(0,*) = x0
positions(1,*) = y0
positions(2,*) = x1
positions(3,*) = y1
;;return the positions, reversing the order to top-to-bottom
return,transpose(reverse(transpose(positions)))
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;!D
;n_colors
;name
;origin: pan/scroll offset
;table_size: number of color table indicies
;unit: file unit open for writing from graphics device
;window: current window, or -1
;[x,y]_
; ch_size: normal width and height of a character in device units
; px_cm: approx # of pixels/cm
; size: total display size in device units
; vsize: size of visible area of display in device units
;zoom: [xzoom,yzoom]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;!P
;background bg color index
;channel: default source or destination channel
;charsize: default=1
;charthick: default=1
;clip: clipping window, two opposite corners of a cube
;font:
;linestyle: 0:______ 1:...... 2:_ _ _ 3: _._._. 4:_..._... 5:__ __ __
;multi: [# plts remaining, cols, rows, stacks, col/row major]
;noclip:
;noerase:
;nsum:
;position: norm coords of plot window (x0,y0,x1,y1)
;psym: 1:+ 2:* 3:. 4:diamond 5:triangle 6:square 7:X
; 8:user-defined (see usersym) 9:undefined 10:histogram mode
;region: norm coords rectangle enclosing plot region
;subtitle; subtitle
;t: homogeneous 4x4 transformation matrix
;t3d:
;thick: default=1
;title: title
;ticklen: fraction of plot size, default=0.02
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;![X,Y,Z]
;charsize: scale to global scale !p.charsize
;crange: output axis range (setting has no effect)
;gridstyle: same indicies as !p.linestyle
;margin: [left (bottom), right (top)] margins in character size units
;minor: number of minor ticks
;omargin: determines area around entire plot area
;range: axis range
;region: norm coords of plot region (read, don't set) (use !p.region)
;s: s(1)*data+s(0)=norm, scale factor for data to norm
; if log scaled then s(1)*log10(data)+s(0)=norm
;style: bitwise flag: bits: 0:rounded/exact 1:/extend5%
; 2:/axis&annotation not drawn 3:box/nobox 4:yzero/ynozero
;thick default=1
;tickformat: [axis,index,value]
;ticklen: norm coord tick lengths
;tickname: max 20 element string array
;ticks: # major tick intervals
;tickv: tick values
;title: axis title
;type: 0: linear 1: log
;window: contains norm coords of the axis end points, the plot window
; setting has no effect. use !p.position
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;