;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