[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Looking for symbols library (psym=8)
- Subject: Re: Looking for symbols library (psym=8)
- From: Brian Jackel <jackel(at)danlon.physics.uwo.ca>
- Date: Thu, 22 Jan 1998 10:24:12 -0700
- Newsgroups: comp.lang.idl-pvwave
- Organization: The University of Calgary
- References: <6a7kiv$25u@post.gsfc.nasa.gov>
- Xref: news.doit.wisc.edu comp.lang.idl-pvwave:9912
Brian D. Schieber wrote:
>
> Does anyone know where I could get a pre-made set of IDL symbol
> defns to extend the sym= keyword for plots? Basically I'm looking
> for a predefined set of symbols for the psym=8 (USERSYM) option in
> PLOT
Here's something called USERSYMBOL.PRO which you might find
useful. It has about a dozen symbols, and allows for changing
size and orientation. Let me know if the attachment doesn't
work (new newsreader) and I'll mail it to you directly.
--
Brian Jackel
bjackel@space.phys.ucalgary.ca
;Brian Jackel University of Western Ontario
;Bug reports cheerfully accepted
;jackel@canlon.physics.uwo.ca
;+
; NAME: UserSymbol
;
; PURPOSE: Make neat little user defined symbols
;
; CATEGORY: Plotting/Graphics
;
; CALLING SEQUENCE: UserSymbol,symbol_name
;
; INPUTS:
; Symbol_name a string containing the name of the desired symbol.
; Some possible options are Square, Triangle, Circle,
; Hexagon, BigX, Clover, Spiral, Star...
;
; KEYWORD PARAMETERS:
; SIZE Symbol size (default=1)
; LIST if set, puts the list of available symbol names
; in the input parameter Symbol_Name
; HELP if set, returns this documentation header
;
; and also the keywords which apply to USERSYM
; THICK Line thickness (default=1)
; FILL Fill symbol? (default=0=no)
; COLOR Symbol color
;
; SIDE EFFECTS: Calls USERSYM to load the new symbol
;
; MODIFICATION HISTORY: Brian Jackel August 10 1992
; University of Western Ontario
;
; Bjj June 2 1994 Fixed up the handling of no clear match.
;-
pro USERSYMBOL,symbol_name,SIZE_OF_SYMBOL=size_of_symbol, $
ORIENTATION=orientation, $
LIST=list,HELP=help,_EXTRA=_extra
ON_ERROR,2
IF KEYWORD_SET(HELP) THEN BEGIN
DOC_LIBRARY,'USERSYMBOL'
RETURN
ENDIF
symbol_list= ['DIAMOND','PENTAGON','CLOVER','PACMAN','SPIRAL','BIGX']
symbol_list= [symbol_list,'CIRCLE','SQUARE','TRIANGLE','STAR','HEXAGON']
IF KEYWORD_SET(LIST) THEN BEGIN
symbol_name= symbol_list
return ;return a list of the available symbols
ENDIF
IF not KEYWORD_SET(SIZE_OF_SYMBOL) THEN symsize=!p.symsize ELSE symsize= (size_of_symbol > 0.01) < 100.0
IF (symsize EQ 0) THEN symsize= 1.0 ;because !p.symsize is sometimes zero
symbol= STRUPCASE( STRCOMPRESS(symbol_name,/REMOVE_ALL) )
CASE symbol OF
'DIAMOND': BEGIN
x= [0.0,0.8,0.0,-0.8,0.0]
y= [1.2,0.0,-1.2,0.0,1.2]
END
'PENTAGON':BEGIN
theta= findgen(6)/5 * 360.0 * !dtor
x= sin(theta)
y= cos(theta)
END
'CLOVER': BEGIN
theta= findgen(41)/40.0 * 360.0 * !dtor
r= ABS(1.0 *symsize* sin(2.0*theta))
x= r * sin(theta)
y= r * cos(theta)
END
'PACMAN': BEGIN
theta= (- findgen(41)/50.0*360.0 + 35.0 )*!dtor
x= [0.0, sin(theta), 0.0]
y= [0.0, cos(theta) ,0.0]
END
'SPIRAL': BEGIN
theta= findgen(41)/40.0 * 720.0 * !dtor
r= theta / MAX(theta)
x= r * sin(theta)
y= r * cos(theta)
END
'BIGX': BEGIN
x= 0.34 * [0,2,3,3,1, 3, 3, 2, 0,-2,-3,-3,-1,-3,-3,-2,0]
y= 0.34 * [1,3,3,2,0,-2,-3,-3,-1,-3,-3,-2, 0, 2, 3, 3,1]
END
'CIRCLE': BEGIN
n= 17.0
theta= findgen(n)/(n-1.0) * 360.0 * !dtor
x= sin(theta)
y= cos(theta)
END
'SQUARE': BEGIN
theta= (findgen(5)/4.0 * 360.0 + 45.0 )*!dtor
x= sin(theta)
y= cos(theta)
END
'TRIANGLE':BEGIN
theta= [0,120,240,360]*!dtor
x= sin(theta)
y= cos(theta)
END
'STAR': BEGIN
theta= [0,36, 72,108, 144,180, 216,252, 288,324,0]*!dtor
r= [1.0,0.4, 1.0,0.4, 1.0,0.4, 1.0,0.4, 1.0,0.4,1.0]
x= r *sin(theta)
y= r *cos(theta)
END
'HEXAGON': BEGIN
theta= [0,60,120,180,240,300,360]*!dtor
x= sin(theta)
y= cos(theta)
END
'SPIRAL2': BEGIN
n=49
theta= 2.0*!pi*FINDGEN(n)/((n-1)/2.0)
r= FINDGEN(n)/(n-1)
x= r*SIN(theta)
y= r*COS(theta)
END
ELSE: BEGIN
MESSAGE,'Unrecognized symbol name, searching for match',/INFORMATIONAL
hits= STRPOS( symbol_list, symbol )
w= WHERE(hits NE -1)
IF (w(0) NE -1) THEN BEGIN ;at least one substring match, use
hit_names= symbol_list(w(0))
FOR i=1,n_elements(w)-1 DO hit_names= hit_names + $
' ' + symbol_list(w(i))
MESSAGE,'...possible matches: '+hit_names,/INFORMATIONAL
MESSAGE,'...will use the first (or only) one',/INFORMATIONAL
symbol_name= symbol_list(w(0)) ;recursion to help us out
USERSYMBOL,symbol_name,_EXTRA=_extra
ENDIF ELSE BEGIN
MESSAGE,'...no quick match. Try USERSYMBOL,list,/LIST',/INFORMATIONAL
ENDELSE
return ;either with a guessed symbol, or a list of them
END
ENDCASE
;Introduce scaling to the symbol size, if requested
;
IF (symsize NE 1.0) THEN BEGIN
x= x * symsize
y= y * symsize
ENDIF
;Rotate the symbol, if requested
;
IF KEYWORD_SET(ORIENTATION) THEN BEGIN
r= SQRT(x^2 + y^2)
theta= ATAN(y,x)
theta= theta + orientation*!dtor
x= r * COS(theta)
y= r * SIN(theta)
ENDIF
;Use the library routine USERSYM to set up the symbol
;
USERSYM,x,y,_EXTRA=_extra
RETURN
END