Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.naic.edu/~astro/IDLCODE/cursplot.pro
Дата изменения: Sat Sep 25 00:03:57 2004
Дата индексирования: Tue Oct 2 05:09:52 2012
Кодировка:

Поисковые слова: light echo
;This program provides some quick and low level interaction with
;plotted data. This program does not cope with logarithms

;Normal syntax is as for 'PLOT' i.e.
;CURSPLOT,X,[Y],/PSYM,/TITLE,/XTITLE,/YTITLE
;where x and y are arrays
;of equal length and represent x data or y data.

;Zooming, by click-and-drag with left mouse button
;Centering by middle button
;Exit with right mouse button

;Print the current plot by clicking inside the square marked 'plot'

;Cursor position (in data co-ordinates) is shown in top right of screen


;HISTORY:
; Feb 20 Created Erik M.
; Feb 25 'print' functionality added - EM.
; Feb 25 'psym' functionality added, re-arrangment of advisory notices on
; plot display area.- EM.
; May 22 added 'max', 'min', 'stdev' and 'mean' informational - EM.
; Sept 18 added 'zoom out' capability - EM.

pro cursplot,xdata,ydata,PSYM=thissym,XTITLE=xtit,YTITLE=ytit,TITLE=tit
oldp=!p.multi
oldymargin=!y.margin
oldxmargin=!x.margin
!p.multi=0
!p.charsize=1
!p.CHARTHICK=1
!y.margin=[6,2]
if keyword_set(xtit) then !y.margin(0)=!y.margin(0)+1
if keyword_set(tit) then !y.margin(1)=!y.margin(1)+1


if n_params() eq 2 then begin
inxdata=xdata
inydata=ydata
; plot,inxdata,inydata,xrange=xr,yrange=yr,$
; ystyle=1,xstyle=1,psym=thissym,xtitle=xtit,ytitle=ytit,title=tit
endif else begin
inydata=xdata
inxdata=findgen(n_elements(xdata))
; plot,inxdata,xrange=xr,yrange=yr,$
; ystyle=1,xstyle=1,psym=thissym,xtitle=xtit,ytitle=ytit,title=tit
endelse
plot,inxdata,inydata,xrange=xr,yrange=yr,$
ystyle=1,xstyle=1,psym=thissym,xtitle=xtit,ytitle=ytit,title=tit


xr=!x.crange
yr=!y.crange
xo=xr ; remember axis ranges for reset
yo=yr
replot:
wherex=(where((inxdata ge xr(0))*(inxdata le xr(1)) eq 1))
if wherex(0) ne -1 then dataxrange=inydata(wherex)
wherey=(where((dataxrange ge yr(0))*(dataxrange le yr(1)) eq 1))

if wherex(0) ne -1 and wherey(0) ne -1 then begin
maxdata=max(dataxrange(wherey))
mindata=min(dataxrange(wherey))
if n_elements(wherey) ne 1 then begin
stdevdata=stdev(dataxrange(wherey))
rmsdata=stdevdata*sqrt(n_elements(wherey))
endif else begin
stdevdata=0.0
rmsdata=0.0
endelse
meandata=mean(dataxrange(wherey))
endif else begin
maxdata=0.0
mindata=0.0
stdevdata=0.0
rmsdata=0.0
meandata=0.0
endelse

!mouse.button=0
plot,inxdata,inydata,xrange=xr,yrange=yr,$
ystyle=1,xstyle=1,psym=thissym,xtitle=xtit,$
ytitle=ytit,title=tit

x1=total(!x.crange)/2.
y1=total(!y.crange)/2.

;organise the size of the box (to click for to plot to hardcopy)
if keyword_set(xtit) then xtra=-0.025 else xtra=0
boxxpts=!x.crange(0)+[0,0.1]*(!x.crange(1)-!x.crange(0))
boxypts=!y.crange(0)+(xtra+[-0.13,-.05])*(!y.crange(1)-!y.crange(0))
zoomxpts=!x.crange(0)+[0.9,1.]*(!x.crange(1)-!x.crange(0))
zoomypts=!y.crange(0)+(xtra+[-0.13,-.05])*(!y.crange(1)-!y.crange(0))

;draw the box on the screen
plots,boxxpts[0:1],[boxypts(0),boxypts(0)],psym=0
plots,[boxxpts[1],boxxpts[1]],boxypts[0:1],psym=0,/continue
plots,[boxxpts[1],boxxpts[0]],[boxypts(1),boxypts(1)],psym=0,/continue
plots,[boxxpts[0],boxxpts[0]],[boxypts[0],boxypts[1]],psym=0,/continue
xyouts,mean(boxxpts),mean(boxypts),"PRINT",align=0.5

plots,zoomxpts[0:1],[zoomypts(0),zoomypts(0)],psym=0
plots,[zoomxpts[1],zoomxpts[1]],zoomypts[0:1],psym=0,/continue
plots,[zoomxpts[1],zoomxpts[0]],[zoomypts(1),zoomypts(1)],psym=0,/continue
plots,[zoomxpts[0],zoomxpts[0]],[zoomypts[0],zoomypts[1]],psym=0,/continue
xyouts,mean(zoomxpts),(zoomypts(1)-zoomypts(0))*(3./5.)+zoomypts(0),"Zoom",align=0.5
xyouts,mean(zoomxpts),(zoomypts(1)-zoomypts(0))*(2./5.)+zoomypts(0),"out",align=0.5

;print informational stuff onto the screen
xyouts,0.2,.06,["Left button, click and drag to zoom"],/normal
xyouts,0.2,.04,["Center button to center plot"],/normal
xyouts,0.2,.02,["Outside left margin to reset"],/normal
xyouts,0.7,.04,["Right button to quit"],/normal
datastr1=strcompress("Max:"+string(maxdata)+" Min:"+string(mindata))
datastr2=strcompress("Stdev:"+string(stdevdata)+" RMS:"+string(rmsdata))
datastr3=strcompress("Mean: "+string(meandata))
xyouts,0.15,0.925+xtra,datastr1,/normal
xyouts,0.15,0.9+xtra,datastr2,/normal
xyouts,0.15,0.875+xtra,datastr3,/normal
oldposstr=strcompress("X:"+string(x1)+" Y: "+string(y1))
xyouts,0.7,0.925+xtra,oldposstr,/normal

while !mouse.button eq 0 do begin
oldposstr=strcompress("X:"+string(x1)+" "+"Y: "+string(y1))
cursor,x1,y1,2,/data
newposstr=strcompress("X:"+string(x1)+" "+"Y: "+string(y1))
xyouts,0.7,0.925+xtra,oldposstr,/normal,color=0
xyouts,0.7,0.925+xtra,newposstr,/normal
endwhile
cursor,x2,y2,4,/data

if x1 lt !x.crange(0) then begin ; request to reset
xr=xo
yr=yo
goto,replot
endif

;request to print
if (x1 ge boxxpts(0) AND x1 le boxxpts(1)) AND $
(y1 ge boxypts(0) AND y1 le boxypts(1)) $
then begin
print,"Printing current plot to cursplot.ps"
recallymargin=!y.margin
set_plot,'ps'
!y.margin=[4.3]
device,filename="cursplot.ps"
plot,inxdata,inydata,$
xrange=xr,yrange=yr,psym=thissym,ystyle=1,xstyle=1,$
xtitle=xtit,ytitle=ytit,title=tit
device,/close
set_plot,'x'
!y.margin=recallymargin
goto, replot
endif

;request to zoom out
if (x1 ge zoomxpts(0) AND x1 le zoomxpts(1)) AND $
(y1 ge zoomypts(0) AND y1 le zoomypts(1)) $
then begin
xr=mean(xr)+2.*(xr-mean(xr))
yr=mean(yr)+2.*(yr-mean(yr))
goto,replot
endif


if !mouse.button eq 1 then begin
if x1 eq x2 and y1 eq y2 then goto,replot
xr=[x1x2]
yr=[y1y2]
goto,replot
endif

if !mouse.button eq 2 then begin
xr=x1+[-abs(xr(0)-xr(1))/2.,abs(xr(0)-xr(1))/2.]
yr=y1+[-abs(yr(0)-yr(1))/2.,abs(yr(0)-yr(1))/2.]
goto,replot
endif

!y.margin=oldymargin
!x.margin=oldxmargin
!p.multi=oldp
end