Grant W. Petty (gpetty@rain.atms.purdue.edu) writes:
> I just learned about the !P.MULTI variable and wanted to use it to put
> multiple panels on a single postscript page. The problem (I
> discovered after much head scratching) is that each of my panels use
> 'tv' and 'plot' calls which require the POSITION keyword for alignment
> (like David's 'imagebar' example in his book and for similar reasons).
> Unfortunately, the POSITION keyword causes IDL to disregard the
> contents of !P.MULTI (except for the first element). I had hoped that
> POSITION would be defined in terms of "virtual" Normalized Device
> Coordinates for the current panel indicated by !P.MULTI, but this is
> apparently not the case. Is there a simple way to get the desired
> effect without having to manually calculate new POSITION coordinates for
> each panel?
A "simple" way!? No, probably not. There was a fairly extensive
discussion in this news group about !P.Multi and the TV command
started by an article by Cathy (csaute3@alumni.umbc.edu) on
28 May 1998. The basic problem is that the TV command doesn't
"advance" the !P.Multi variable, nor can you figure out where
to put the image until *after* something has been plotted in
the window.
Sometimes this is not a problem because you can write the
program in such a way as to get a PLOT command (or something
else) to fulfill this essential role.
I offered this simple program as an example that could
position an image with axes around it in a window that
is set up with !P.Multi.
The program works like this. First, set up !P.Multi.
IDL> !P.Multi=[0, 3, 2]
Then, pass this information to the program:
IDL> MultiImages, !P.Multi
Works great in this limited capacity. :-)
Cheers,
David
**************************************************************
PRO MultiImages, multi
IF N_Params() NE 1 THEN multi = [0, 2, 2]
imageFile = Filepath(SubDir=['examples','data'], 'worldelv.dat')
image = BytArr(360, 360)
OpenR, lun, imageFile, /Get_LUN
ReadU, lun, image
Free_Lun, lun
Window, XSize=500, YSize=400
!P.Multi = multi
FOR j=0, multi[1]*multi[2]-1 DO BEGIN
Plot, Findgen(11), Color=!P.Background
x1 = !X.Region[0] + 0.05
x2 = !X.Region[1] - 0.05
y1 = !Y.Region[0] + 0.05
y2 = !Y.Region[1] - 0.05
TVImage, image, Position=[x1, y1, x2, y2]
Plot, Findgen(11), position=[x1, y1, x2, y2], xticklen=-0.02, $
yticklen=-0.02, xtitle='latitude', ytitle='longitude', $
/nodata, /noerase
ENDFOR
END
***************************************************************
David Fanning, Ph.D.
Fanning Software Consulting
Phone: 970-221-0438 E-Mail: davidf@dfanning.com
Coyote's Guide to IDL Programming: http://www.dfanning.com/
Toll-Free IDL Book Orders: 1-888-461-0155
[Note: This follow-up was e-mailed to the cited author.]