coyote’s guide to idl programming david fanning. five ways to improve your idl programming now...
TRANSCRIPT
Coyote’sGuide toIDLProgramming
David Fanning
Five Ways To Improve Your IDL Programming Now
• Learn the Essential Web Resources• Learn How Colors Work in IDL• Learn 10 Essential Graphics Keywords• Learn the “IDL Way” to Avoid FOR Loops• Learn to Produce Perfect PostScript Output
Six Essential IDL Resources
• Coyote’s Guide to IDL Programming
• IDL Newsgroupcomp.lang.idl-pvwave
http://www.dfanning.com
• Curve Fitting and Mathematicshttp://cow.physics.wisc.edu/~craigm/idl/idl.html
• IDL Emacs Mode (IDLWAVE)http://www.idlwave.org/
• NASA Astronomy Libraryhttp://idlastro.gsfc.nasa.gov/homepage.html
• JHUAPL IDL Libraryhttp://fermi.jhuapl.edu/s1r/idl/s1rlib/local_idl.html
NASA Astronomy Library (http://idlastro.gsfc.nasa.gov/homepage.html)
• Only way to read FITS data• Hundreds of useful, and well-tested routines for
math, statistics, and astronomical utilities• Should already be on your path• The Astronomy Links page is the source of IDL
software used for astronomy
JHUAPL IDL Library (http://fermi.jhuapl.edu/s1r/idl/s1rlib/local_idl.html)
• Solid, well-written library maintained by Ray Sterner• Excellent for time-series data• Date and time routines are best anywhere• Array processing code, filters• Math routines• Often used in conjunction with Astronomy Lib
Craig Markwardt’s IDL Library (http://cow.physics.wisc.edu/~craigm/idl/idl.html)
• Statistical routines • Specialized peak and ellipse fitting applications • Non-linear optimization routines• Optimized set operations (intersect, union, XOR)• Mathematics (array operators, quaternions, etc.)• Integration and differentiation routines• Non-linear least-squares curve fitting
MPFIT Curve Fitting
• Non-linear least-squares curve fitting• Replacement for CURVEFIT• Robust MINPACK-1 FORTRAN subroutine• Unlimited number of parameters• Each parameter can be held fixed or limited to
defined max and min values• Easy access to MPFIT through wrappers• An interactive interface to MPFIT is available
(PAN from NIST)
Using MPFit
PlotErr, t, r, rerr, PSym=3
expr = ‘P[0] + Gauss1(X, P[1:3])
start = [950D, 2.5, 1.0, 1000.0)
result = MPFitExpr(expr, t, r, rerr, start)
OPlot, t, result[0] + Gauss1(t, result[1:3])
Print, result
997.61864 2.1550703 1.4488421 3040.2411
Constraining Parameters
PlotErr, t, r, rerr, PSym=3
expr = ‘P[0] + Gauss1(X, P[1:3])
pinfo = Replicate( { fixed:0, limited:[0,0], limits:[0.D, 0.D] }, 4 )
pinfo[0].fixed = 1
start = [1000.D, 2.5, 1.0, 1000.0]
result = MPFitExpr(expr, t, r, rerr, start, PARINFO=pinfo)
OPlot, t, result[0] + Gauss1(t, result[1:3])
Print, result
1000.0000 2.1549624 1.4427532 3021.8174
Fix the constant parameter at 1000.
Constraining Parameters
PlotErr, t, r, rerr, PSym=3
expr = ‘P[0] + Gauss1(X, P[1:3])
pinfo = Replicate( { fixed:0, limited:[0,0], limits:[0.D, 0.D] }, 4 )
pinfo[1].limited[0] = 1
pinfo[1].limits[0] = 2.3
start = [1000.D, 2.5, 1.0, 1000.0]
result = MPFitExpr(expr, t, r, rerr, start, PARINFO=pinfo)
OPlot, t, result[0] + Gauss1(t, result[1:3])
Print, result
997.56563 2.3000000 1.4557194 3035.0424
Limit the mean to a minimum of 2.3.
IDLWAVE Emacs Mode(http://www.idlwave.org/)
• Color-coded editor• Outstanding HTML help• Optional auto-corrected typing for enforcing syntax• Code completion and checking• Several types of interactive debugging tools• Catalog system can scan ALL IDL libraries!• Outstanding support via IDL newsgroup
Six Essential IDL Resources
• Coyote’s Guide to IDL Programming
• IDL Newsgroupcomp.lang.idl-pvwave
www.dfanning.com
• Curve Fitting and Mathematicshttp://cow.physics.wisc.edu/~craigm/idl/idl.html
• IDL Emacs Mode (IDLWAVE)http://www.idlwave.org/
• NASA Astronomy Libraryhttp://idlastro.gsfc.nasa.gov/homepage.html
• JHUAPL IDL Libraryhttp://fermi.jhuapl.edu/s1r/idl/s1rlib/local_idl.html
Coyote’s Guide to IDL Programming
(http://www.dfanning.com)
• 300+ articles in the IDL Tips and Tricks section• Tutorials on essential subjects• 75+ IDL example programs• IDL bug reports• Ask an IDL Question • Order an IDL book• Links to other sites• Learn the latest about Coyote’s adventures
Must-Read Articles for Astronomers
• Dimensional Juggling Tutorial• Array Concatenation Tutorial• Histogram: The Breathless Horror and
Disgust• Are FOR Loops the Embodiment of Pure Evil?• Are FOR Loops Really Evil?• Average Astrophysicist Increased Program
Speed by a Factor of 8100! (http://tinyurl.com/5w3y9)
• How to Get Perfect PostScript Output
IDL Newsgroup(comp.lang.idl-pvwave)
• Friendliest newsgroup on the Internet• 20+ IDL experts share their knowledge• RSI engineers lurk on the newsgroup• Searchable database on groups.google.com• Hitting SEND button is best way to learn IDL• Info on IDL Expert Programmers Association
Five Ways To Improve Your IDL Programming Now
• Learn the Essential Web Resources• Learn How Colors Work in IDL• Learn 10 Essential Graphics Keywords• Learn the “IDL Way” to Avoid FOR Loops• Learn to Produce Perfect PostScript Output
True-Color Color Decomposition
If your graphic output looks like this youdon’t understand color decomposition.With 24-bit graphics, color decompositionis always ON by default.
IDL> Plot, data, Color=255
IDL> Help, /Device Simultaneously displayable colors: 16777216
Number of allowed color values: 16777216
IDL Color Table Entries: 256
NOTE: this is a TrueColor device
Using Decomposed color
Steel Blue (70,130,180)
1 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 = 11829830Lredgreenblue
IDL> Device, Decomposed=1
IDL> Print, 70L + (130L * 2L^8) + (180L * 2L^16)
11829830
IDL> Plot, data, Color=11829830L, Background=‘ffffff’xL
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 = 255Lredgreenblue
IDL> Plot, data, Color=255
01234
70..
255
01234.
130.
255
01234..
180255
01234...
255
Index R G B
132522702...
45
674487
13038...
255
80178223180177
.
.
.128
01234...
255
Index R G B
24-Bit Color 8-Bit Color
Plot, data, Color= 11829830L Plot, data, Color=3
Color Decomposition ON Color Decomposition OFF
Steel Blue (70,130,180)
24-bit Non-Decomposed Color
IDL> TVLCT, 70, 130, 180, 240
IDL> Device, Decomposed=0
IDL> Plot, data, Color=240, Background=255
Device Independent Color
• Use FSC_Color for specifying colors by name
IDL> Plot, data, Color=FSC_Color(‘Steel Blue’)
• Color decomposition independent• Works in PostScript, Z-graphics buffer, display• Stay away from top and bottom of color table for drawing colors• 88 colors are available. Can easily add your own colors or load them from a file
Example Code
bg = FSC_Color(‘ivory’)
fg = FSC_Color(‘navy’)
Plot, data, Color=fg, Background=bg, /NoData
Oplot, data1, Color=FSC_Color(‘saddle brown’)
Oplot, data2, Color= FSC_Color(‘indian red’)
Oplot, data3, Color= FSC_Color(‘forest green’)
IDL> Device, Decomposed=1
IDL> Loadct, 13
IDL> TV, image
IDL> Device, Decomposed=0
IDL> Loadct, 13
IDL> TV, image
IDL> TVImage, image
IDL> image = TVRead()
Five Ways To Improve Your IDL Programming Now
• Learn the Essential Web Resources• Learn How Colors Work in IDL• Learn 10 Essential Graphics Keywords• Learn the “IDL Way” to Avoid FOR Loops• Learn to Produce Perfect PostScript Output
Position Plots with POSITION
Plot, data, Position=[0.10, 0.10, 0.45, 0.90]
Plot, data, Position=[0.55, 0.10, 0.95, 0.65], /NoErase
XYOutS, 0.75, 0.8, ‘Position Plots Here’, Alignment=0.5, $
/Normal, Font=0
Always use Normal or Data coordinatesfor device-independent placement oftext and graphics.
Position Plots with POSITION
IDL> Plot, data
IDL> Plot, data, Position=Aspect(1.0)
Find a Positionable TV Command
IDL> Pos = [0.1, 0.1, 0.9, 0.9]
IDL> TVImage, image, Position=pos, /Keep_Aspect, /NoInterpolation
IDL> Plot, findgen(100), /NoData, Position=pos, /NoErase
•TVImage•ImgDisp•PlotImage
Avoid Auto-scaling Axes
Plot, data, XRange=[23.4, 78]
Plot, data, XRange=[23.4, 78], $XStyle=1
Avoid Auto-scaling Axes
Contour, image, NLevels=12
Contour, image, NLevels=12 $XStyle=1, YStyle=1
Plotting Symbols
Plot, data, PSym=2
Plot, data, PSym=-2
1 Plus sign (+)
2 Asterisk (*)
3 Period (.)
4 Diamond
5 Triangle
6 Square
7 X
8 User-defined.
Create Plotting Symbols(USERSYM)
Filled Circlephi = Findgen(32) * (!PI * 2 / 32.)
phi = [ phi, phi[0] ]
UserSym, Cos(phi), Sin(phi), /Fill
Plot, data, PSym=8, Symsize=1.25
Filled TrianglesUserSym, [ -1, 1, -1, -1 ], [1, 0, -1, 1 ], /Fill ; Filled right-facing triangle.
UserSym, [ 1, -1, 1, 1 ], [1, 0, -1, 1 ], /Fill ; Filled left-facing triangle.
UserSym, [ -1, 1, -1, -1 ], [1, 0, -1, 1 ] ; Open right-facing triangle.
Color with Symbols
phi = Findgen(32) * (!PI * 2 / 32.)
phi = [ phi, phi[0] ]
UserSym, Cos(phi), Sin(phi), /Fill
Plot, data, /NoData
OPlot, data, Color=FSC_Color('firebrick'),
Oplot, data, color=FSC_Color('forest green'), $
PSym=8, Symsize=1.5
Keyword Inheritance (_Extra)
PRO MyPlot, data, Color=color, DataColor=dataColor
IF N_Elements(color) NE 0 THEN $ Message, ‘Color is replaced by DataColor keyword’
IF N_Elements(dataColor) EQ 0 THEN dataColor=‘steel blue’
Plot, data, Color=FSC_Color(dataColor)
END
PRO MyPlot, data, Color=color, DataColor=dataColor, _Extra=extra
IF N_Elements(color) NE 0 THEN $ Message, ‘Color is replaced by DataColor keyword’
IF N_Elements(dataColor) EQ 0 THEN dataColor=‘steel blue’
Plot, data, Color=FSC_Color(dataColor), _Extra=extra
END
Keyword Inheritance (_Extra)
IDL> MyPlot, findgen(11), Charsize=2.0, Title=‘My Color Plot’, DataColor=‘green’
extra = { charsize: 2.0, title=‘My Color Plot’ }
IDL> kw = PSConfig(/European)
IDL> Set_Plot, ‘PS’
IDL> Device, _Extra=kw
Five Ways To Improve Your IDL Programming Now
• Learn the Essential Web Resources• Learn How Colors Work in IDL• Learn 10 Essential Graphics Keywords• Learn the “IDL Way” to Avoid FOR Loops• Learn to Produce Perfect PostScript Output
Avoid FOR Loops if PossibleIDL> array = Indgen(3,4)
IDL> Print, array 0 1 2
3 4 5
6 7 8
9 10 11
Fortran Way:
For j=0,2 Do Begin
For k=0,3 Do Begin
array(j,k) = array(j,k) * 3
Endfor
Endfor
Multiply array by 3IDL Way:
array = array * 3
Array OperatorsSet all values greater than 5 to 5.
Fortran Way:
For j=0,2 Do Begin
For k=0,3 Do Begin
IF array(j,k) GT 5 THEN array(j,k) = 5
Endfor
Endfor
IDL Way:
array = array < 5
IDL> array = Indgen(3,4)
IDL> Print, array < 5 0 1 2
3 4 5
5 5 5
5 5 5
WHERE much faster than IFSet all values between 5 to 8 equal = 15.
Fortran Way:
For j=0,2 Do Begin
For k=0,3 Do Begin
IF (array(j,k) GE 5) AND (array(j,k) LT 8) THEN array(j,k) = 15
EndFor
EndFor
IDL Way:
index = Where((array GE 5) AND (array LE 8), count)
IF count GT 0 THEN array[index] = 15
Convert 1D Indices to 2D Indices
array = Round(Randomu(-3L, 5, 5) * 10)
Print, array 9 6 8 6 1
10 0 2 1 10
9 9 8 2 2
8 1 7 0 1
7 0 2 1 3
indices = Where((array GE 3) AND (array LE 7), count)
IF count GT 0 THEN array[index] = 99
Print, array 9 99 8 99 1
10 0 2 1 10
9 9 8 2 2
8 1 99 0 1
99 0 2 1 3
Convert 1D Indices to 2D Indicesarray = Round(Randomu(-3L, 5, 5) * 10)
Print, array 9 6 8 6 1
10 0 2 1 10
9 9 8 2 2
8 1 7 0 1
7 0 2 1 3
indices = Where((array GE 3) AND (array LE 7), count)
result = Array_Indices(array, indices)
col = Reform(result [0,*])
row = Reform(result [1,*])
IF count GT 0 THEN array[col, row] = 99
Print, array 9 99 8 99 1
10 0 2 1 10
9 9 8 2 2
8 1 99 0 1
99 0 2 1 3
Convert 1D Indices to 2D Indicesindices = Where((image GE 0.55) AND (image LE 0.65), count)
IF count GT 0 THEN BEGIN
result = Array_Indices(image, indices)
col = Reform(result [0,*])
row = Reform(result [1,*])
TV, image
PlotS, col, row, /Device, Color=FSC_Color(‘yellow’)
ENDIF
Dimensional JugglingMultiply each column of array by a vector, b.
Fortran Way:
var = IntArr(3,4)
For j=0,2 Do Begin
var[j,*] = array[j,*] * b
EndFor
IDL> array = Indgen(3,4)
IDL> b = Fix(RandomU(-1L, 4) * 12
IDL> Print, array
0 1 4 4 5 6
7 8 9
10 11 12
IDL> Print, b 4 1 9 6
Dimensional JugglingMultiply each column of array by a vector, b.
IDL> Print, b 4 1 9 6
IDL> Print, Reform(b, 1, 4) 4
1
9
6
IDL> Print, Rebin( Reform(b, 1, 4), 3, 4) 4 4 4
1 1 1
9 9 9
6 6 6
IDL Way:Print, var = array * Rebin( Reform(b, 1, 4), 3, 4 )
col = Transpose(b)
col = Rotate(b,1)
col = 1 # b
col = b ## 1
Dimensional Juggling Can extend this to any number of dimensions.
IDL> array = Indgen(3,4,3) 0 1 2
3 4 5
6 7 8
9 10 11
12 13 14
15 16 17
18 19 20
21 22 23
24 25 26
27 28 29
30 31 32
33 34 35
IDL> Print, Rebin( Reform(b,1,4,1), 3, 4, 3) 4 4 4
1 1 1
9 9 9
6 6 6
4 4 4
1 1 1
9 9 9
6 6 6
4 4 4
1 1 1
9 9 9
6 6 6
Array ConcatenationIDL> a = Make_Array(4, 4, Value=1B)
IDL> Print, a 1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
IDL> b = Make_Array(4, 4, Value=2B)
IDL> Print, b 2 2 2 2
2 2 2 2
2 2 2 2
2 2 2 2
IDL> Print, [a, b] 1 1 1 1 2 2 2 2
1 1 1 1 2 2 2 2
1 1 1 1 2 2 2 2
1 1 1 1 2 2 2 2
Array ConcatenationIDL> Print, [ [a], [b] ]
IDL> Print, a 1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
2 2 2 2
2 2 2 2
2 2 2 2
2 2 2 2
IDL> Help, [ [a], [b] ] INT = Array[4, 8]
IDL> Print, [ [ [a] ], [ [b] ] ]
IDL> Print, a 1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
2 2 2 2
2 2 2 2
2 2 2 2
2 2 2 2
IDL> Help, [ [ [a] ], [ [b] ] ] INT = Array[4, 4, 2]
Array Concatenation
IDL> b = (Indgen(4) + 1) * 4
IDL> Print, [ [a], [b], [b] ] 1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
4 8 12 16
4 8 12 16
IDL> Help, [ [a], [b], [b] ] INT = Array[4, 6]
Add rows to an array.
IDL> b = Reform((Indgen(4) + 1) * 4, 1, 4)
IDL> Print, [ b, a, b ] 4 1 1 1 1 4
8 1 1 1 1 8
12 1 1 1 1 12
16 1 1 1 1 16
IDL> Help, [ b, a, b ] INT = Array[6, 4]
Add columns to an array.
Array Concatenation
IDL> image24 = [ [ [image_1] ], [ [image_2] ], [ [image_3] ] ]
IDL> Help, image24 INT = Array[400, 600, 3]
Create a true-color image
Convert band interleaved image to pixel interleaved
IDL> image24 = Transpose(image24,[2,0,1])
IDL> Help, image24 INT = Array[3, 400, 600]
Index Manipulation
img1 = BytScl(Loaddata(4), Top=99)
img2 = BytScl(Loaddata(5), Top=99)+100B
LoadCT, 13, NColors=100
LoadCT, 3, NColors=100, Bottom=100
index = Where((Indgen(256L*256L) MOD 2) EQ 0)
img1[index] = img2[index]
Window, XSize=256, YSize=256
TV, img1
Quick look at two images simultaneously.
Index Manipulation
IDL> data = Indgen(8,4) + 1
IDL> Print, data 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 227 28 29 30 31 32
IDL> evenRowIndex = (Indgen(4/2) * 2) + 1
IDL> data[*, evenRowIndex] = Reverse(data[*, evenRowIndex])
IDL> Print, data 1 2 3 4 5 6 7 8
16 15 14 13 12 11 10 9
17 18 19 20 21 22 23 24
32 31 30 29 28 27 26 25
Reverse the even rows in a 2D array.
Histogram Magic
IDL> a = Indgen(10)
IDL> Print, Histogram(a, Binsize=5) 5 5
IDL> Print, Histogram(a) 1 1 1 1 1 1 1 1 1 1
IDL> data = Randomu(-3L, 100)
IDL> Print, Histogram(data, Binsize=0.20) 25 17 22 18 18
A histogram is used to count how many elements fall into “bins”.
Histogram MagicIf binning data was all Histogram did, it would beuseful, but not spectacular! Think of Histogram as an index manipulator and it becomes a lot more exciting.
IDL> data=fix(randomu(101,25)*12) & Print, data 5 2 6 11 7 1 4 0 10 11 4 0 1 10 0 4 3 11 9 4 1 1 11 4 3IDL> h = Histogram(data, REVERSE_INDICES=ri)
3 4 1 2 5 1 1 1 0 1 2 4 | | | | |6 | | | | | | | || |5 | | |10 | | | | | | |3 ||7 |12 | | |15 | | | | | | |9 ||11 |20 | |16 |19 | | | | | |8 |17 ||14 |21 |1 |24 |23 |0 |2 |4 | |18 |3 |22 |+---+---+---+---+---+---+---+---+---+---+---+---+ 0 1 2 3 4 5 6 7 8 9 10 11
Histogram MagicHistogram is fast, much faster than Where. 3 4 1 2 5 1 1 1 0 1 2 4 | | | | |6 | | | | | | | || |5 | | |10 | | | | | | |3 ||7 |12 | | |15 | | | | | | |9 ||11 |20 | |16 |19 | | | | | |8 |17 ||14 |21 |1 |24 |23 |0 |2 |4 | |18 |3 |22 |+---+---+---+---+---+---+---+---+---+---+---+---+ 0 1 2 3 4 5 6 7 8 9 10 11
The “I” vector The “O” vectorri = iiiiiiiiiiiiiiiiiiioooooooooooooooooooooooooooooo |-----------------||----------------------------| |0 nh||nh+1 nh+total(h)|
The o-vector contains the data indices, in order, and the i-vector just shows us where to go to get them.
| | | | |6 | | | | | | | || |5 | | |10 | | | | | | |3 ||7 |12 | | |15 | | | | | | |9 ||11 |20 | |16 |19 | | | | | |8 |17 ||14 |21 |1 |24 |23 |0 |2 |4 | |18 |3 |22 |+---+---+---+---+---+---+---+---+---+---+---+---+ 0 1 2 3 4 5 6 7 8 9 10 11
IDL> Print, ri[ri[4]:ri[5]-1] 6 10 15 19 23
IDL> Print, data[ri[ri[4]:ri[5]-1]] 4 4 4 4 4
IDL> if ri[4] ne ri[5] then Print, data[ri[ri[4]:ri[5]-1]] else Print, 'No data in bin 4‘ 4 4 4 4 4
IDL> if ri[8] ne ri[9] then Print, data[ri[ri[8]:ri[8]-1]] else Print, 'No data in bin 8' No data in bin 8
Reverse_Indices looks ugly, but works great!
The “I” vector The “O” vectorri = iiiiiiiiiiiiiiiiiiioooooooooooooooooooooooooooooo |-----------------||----------------------------| |0 nh||nh+1 nh+total(h)|
Using Histogram
Find the intersection (common elements) of two vectors.
IDL> sd = -3LIDL> a = Fix( Randomu(sd, 8) * 20 )IDL> b = Fix( Randomu(sd, 8) * 20 )IDL> Print, a, b 17 11 15 11 1 19 0 4 2 19 17 18 16 3 4 16IDL> Print, Where(Histogram(a, OMin=om) gt 0 AND Histogram(b, Min=om) gt 0) + om 4 17 19
Find the union (elements in either vector) of two vectors.
IDL> Print, Where(Histogram([a,b], OMin = om)) + om 0 1 2 3 4 11 15 16 17 18 19
Using Histogram
Remove elements, listed in random order, from a vector.
IDL> vec = Randomu(sd,10) IDL> remove = [3,7,2,8] IDL> keep = Where(Histogram(remove,MIN=0,MAX=N_Elements(vec)-1) eq 0,cnt) IDL> if cnt ne 0 then vec = vec[keep] IDL> print,keep 0 1 4 5 6 9
Find the median value for each quartile of a data set.
IDL> data = Randomu(sd,100)*100IDL> h = Histogram(data,Binsize=25, Reverse_Indices=ri)IDL> med = FltArr(4)IDL> for j=0L,3L do if ri[j+1] gt ri[j] then med[j] = Median(data[ri[ri[j]:ri[j+1]-1]])IDL> print,med 15.2426 40.9219 63.8255 86.1637
Five Ways To Improve Your IDL Programming Now
• Learn the Essential Web Resources• Learn How Colors Work in IDL• Learn 10 Essential Graphics Keywords• Learn the “IDL Way” to Avoid FOR Loops• Learn to Produce Perfect PostScript Output
Set up Window on PostScript Page
Set_Plot, ‘PS’Device, XSize=xs, YSize=ys, XOffset=xoff, YOffset=yoff, /Landscape
Create a PostScript Window with the Correct Aspect Ratio
Plot, data
keywords = PSWindow()
Help, keywords, /Structure XSIZE FLOAT 5.95000 YSIZE FLOAT 5.95000
XOFFSET FLOAT 1.27500
YOFFSET FLOAT 2.52500
INCHES INT 1
PORTRAIT INT 1
LANDSCAPE INT 0
thisDevice = !D.Name
Set_Plot, ‘PS’
Device, _Extra=keywords
Plot, data
Device, /Close_File
Set_Plot, thisDevice
Position Plots with POSITION
Plot, data, Position=[0.10, 0.10, 0.45, 0.90]
Plot, data, Position=[0.55, 0.10, 0.95, 0.65], /NoErase
XYOutS, 0.75, 0.8, ‘Position Plots Here’, Alignment=0.5, $
/Normal, Font=0
Always use Normal or Data coordinatesfor device-independent placement oftext and graphics.
Use a Positionable TV Command
IDL> Pos = [0.1, 0.1, 0.9, 0.9]
IDL> TVImage, image, Position=pos, /Keep_Aspect, /NoInterpolation
IDL> Plot, findgen(100), /NoData, Position=pos, /NoErase
•TVImage•ImgDisp•PlotImage
PostScript Setup
keywords = PSConfig(Cancel=cancelled)
IF cancelled THEN RETURN
thisDevice = !D.Name
Set_Plot, ‘PS’
Device, _Extra=keywords
Plot, data
Device, /Close
Set_Plot, thisDevice
Load Drawing Colors Properly
bg = FSC_Color(‘ivory’)
fg = FSC_Color(‘navy’)
Plot, data, Color=fg, Background=bg, /NoData
Oplot, data1, Color=FSC_Color(‘saddle brown’)
Oplot, data2, Color= FSC_Color(‘indian red’)
Oplot, data3, Color= FSC_Color(‘forest green’)
Use PostScript or True-Type Fonts
Plot, data, Font=0
!P.Font = 0
Device, Set_Font=‘Arial*14’, /TT_Font
Plot, data, Font=1
XYOutS, 0.75, 0.8, ‘Position Plots Here’, /Normal, Font=1
You will have better looking plots if you use PostScript or True-Type fonts. If youuse TeXtoIDL be sure to set the PostScriptkeyword.
Protect Device-Specific Code
IF (!D.Flags AND 256) NE 0 THEN $ ; Windows supportedWindow, XSize=400, YSize=400
bg = FSC_Color(‘ivory’)
fg = FSC_Color(‘navy’)
Plot, data, Color=fg, Background=bg, /NoData
Oplot, data1, Color=FSC_Color(‘saddle brown’)
Oplot, data2, Color= FSC_Color(‘indian red’)
Oplot, data3, Color= FSC_Color(‘forest green’)
Other commands to protect:• WSet, wid• Device, Decomposed=0
Coyote’sGuide toIDLProgramming
David Fanning