pltxxt(3f) - [M_datapac:LINE_PLOT] generate a line printer lag plot
for the terminal (71 characters wide)
SUBROUTINE PLTXXT(X,N)
pltxxt(3f) yields a narrow-width (71-character) plot of x(i) versus
x(i-1). Its narrow width makes it appropriate for use on a terminal.
this type of plot (which is called an autocorrelation plot or a lag
1 plot) is useful in examining for autocorrelation in a sequence
of observations.
uncorrelated data will produce an autocorrelation plot with no apparent
structure; autocorrelated data will produce an autocorrelation plot
with linear, elliptical, or other kinds of structure.
X description of parameter
Y description of parameter
Sample program:
program demo_pltxxt
use M_datapac, only : pltxxt
implicit none
! call pltxxt(x,y)
end program demo_pltxxt
Results:
The original DATAPAC library was written by James Filliben of the
Statistical Engineering Division, National Institute of Standards
and Technology.
John Urban, 2022.05.31
CC0-1.0
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=wp), | dimension(:) | :: | X | |||
integer | :: | N |
SUBROUTINE PLTXXT(X,N) REAL(kind=wp) :: aim1 , airow , anumcm , anumlm , anumr , anumrm , cutoff , & & delx , hold , X , x2labl , xcwidt , xlable , xlower , xmax , & & xmin , xrwidt , xupper INTEGER :: i , icol , icolmx , im1 , irow , ixdel , N , & & numcol , numlab , numr25 , numr50 , numr75 , numrow ! ! INPUT ARGUMENTS--X = THE VECTOR OF ! (UNSORTED) OBSERVATIONS ! TO BE GRAPHICALLY TESTED FOR ! AUTOCORRELATION. ! --N = THE INTEGER NUMBER OF OBSERVATIONS ! IN THE VECTOR X. ! OUTPUT--A NARROW-WIDTH (71-CHARACTER) TERMINAL PLOT ! OF X(I) VERSUS X(I-1). ! THE BODY OF THE PLOT (NOT COUNTING AXIS VALUES ! AND MARGINS) IS 25 ROWS (LINES) AND 49 COLUMNS. ! PRINTING--YES. ! RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE ! OF N FOR THIS SUBROUTINE. ! MODE OF INTERNAL OPERATIONS--. ! COMMENT--VALUES IN THE VERTICAL AXIS VECTOR (X) WHICH ARE ! EQUAL TO OR IN EXCESS OF 10.0**10 WILL NOT BE ! PLOTTED. ! THIS CONVENTION GREATLY SIMPLIFIES THE PROBLEM ! OF PLOTTING WHEN SOME ELEMENTS IN THE VECTOR X ! ARE 'MISSING DATA', OR WHEN WE PURPOSELY ! WANT TO IGNORE CERTAIN ELEMENTS IN THE VECTOR X ! FOR PLOTTING PURPOSES (THAT IS, WE DO NOT ! WANT CERTAIN ELEMENTS IN X TO BE PLOTTED). ! TO CAUSE SPECIFIC ELEMENTS IN X TO BE ! IGNORED, WE REPLACE THE ELEMENTS BEFOREHAND ! (BY, FOR EXAMPLE, USE OF THE REPLAC SUBROUTINE) ! BY SOME LARGE VALUE (LIKE, SAY, 10.0**10) AND ! THEY WILL SUBSEQUENTLY BE IGNORED IN THE PLTXXT ! SUBROUTINE. ! --NOTE THAT THE STORAGE REQUIREMENTS FOR THIS ! (AND THE OTHER) TERMINAL PLOT SUBROUTINESS ARE . ! VERY SMALL. ! THIS IS DUE TO THE 'ONE LINE AT A TIME' ALGORITHM ! EMPLOYED FOR THE PLOT. ! ORIGINAL VERSION--FEBRUARY 1974. ! UPDATED --APRIL 1974. ! UPDATED --OCTOBER 1974. ! UPDATED --OCTOBER 1975. ! UPDATED --NOVEMBER 1975. ! UPDATED --FEBRUARY 1977. ! !--------------------------------------------------------------------- ! CHARACTER(len=4) :: iline CHARACTER(len=4) :: iaxisc CHARACTER(len=4) :: sbnam1 , sbnam2 CHARACTER(len=4) :: alph11 , alph12 , alph21 , alph22 CHARACTER(len=4) :: blank , hyphen , alphai , alphax ! DIMENSION X(:) DIMENSION iline(72) , x2labl(10) ! DATA sbnam1 , sbnam2/'PLTX' , 'XT '/ DATA alph11 , alph12/'FIRS' , 'T '/ DATA alph21 , alph22/'SECO' , 'ND '/ DATA blank , hyphen , alphai , alphax/' ' , '-' , 'I' , 'X'/ ! cutoff = (10.0_wp**10) - 1000.0_wp ! ! CHECK THE INPUT ARGUMENTS FOR ERRORS ! IF ( N<1 ) THEN WRITE (G_IO,99010) WRITE (G_IO,99011) WRITE (G_IO,99012) alph21 , alph22 , sbnam1 , sbnam2 WRITE (G_IO,99001) N 99001 FORMAT (' ','IS NON-NEGATIVE (WITH VALUE = ',I0,')') WRITE (G_IO,99010) RETURN ELSE IF ( N==1 ) THEN WRITE (G_IO,99010) WRITE (G_IO,99011) WRITE (G_IO,99012) alph21 , alph22 , sbnam1 , sbnam2 WRITE (G_IO,99002) N 99002 FORMAT (' ','HAS THE VALUE 1') WRITE (G_IO,99010) RETURN ELSE ! hold = X(1) DO i = 2 , N IF ( X(i)/=hold ) GOTO 50 ENDDO WRITE (G_IO,99010) WRITE (G_IO,99011) WRITE (G_IO,99012) alph11 , alph12 , sbnam1 , sbnam2 WRITE (G_IO,99003) hold 99003 FORMAT (' ','HAS ALL ELEMENTS = ',E15.8) WRITE (G_IO,99010) RETURN ENDIF ! 50 DO i = 1 , N IF ( X(i)<cutoff ) GOTO 100 ENDDO WRITE (G_IO,99010) WRITE (G_IO,99011) WRITE (G_IO,99012) alph11 , alph12 , sbnam1 , sbnam2 WRITE (G_IO,99004) 99004 FORMAT (' ','HAS ALL ELEMENTS IN EXCESS OF THE CUTOFF') WRITE (G_IO,99005) cutoff 99005 FORMAT (' ','VALUE OF ',E15.8) WRITE (G_IO,99010) RETURN ENDIF ! !-----START POINT----------------------------------------------------- ! ! DEFINE THE NUMBER OF ROWS AND COLUMNS WITHIN THE PLOT-- ! THIS HAS BEEN SET TO 25 ROWS AND 49 COLUMNS. ! 100 numrow = 25 numcol = 49 anumr = numrow anumrm = numrow - 1 anumcm = numcol - 1 numr25 = (numrow/4) + 1 numr50 = (numrow/2) + 1 numr75 = 3*(numrow/4) + 1 ixdel = (numcol-1)/4 numlab = 5 anumlm = numlab - 1 ! ! WRITE OUT THE TOP HORIZONTAL AXIS OF THE PLOT, AND SKIP 1 LINE ! FOR A MARGIN WITHIN THE PLOT. ! WRITE (G_IO,99006) 99006 FORMAT (' ') WRITE (G_IO,99007) ! 99007 FORMAT (' ', & &'THE FOLLOWING IS A PLOT OF X(I) (VERTICALLY) VS. , 21HX(I-1) (HO& &RIZONTALLY)') DO icol = 1 , numcol iline(icol) = hyphen ENDDO DO icol = 1 , numcol , ixdel iline(icol) = alphai ENDDO WRITE (G_IO,99013) (iline(i),i=1,numcol) WRITE (G_IO,99014) blank ! ! DETERMINE THE MIN AND MAX VALUES OF X. ! xmin = X(1) xmax = X(1) DO i = 1 , N IF ( X(i)<cutoff ) THEN IF ( X(i)<xmin ) xmin = X(i) IF ( X(i)>xmax ) xmax = X(i) ENDIF ENDDO delx = xmax - xmin xrwidt = delx/anumrm xcwidt = delx/anumcm ! ! DETERMINE AND WRITE OUT THE PLOT POSITIONS ONE LINE AT A TIME. ! DO irow = 1 , numrow DO icol = 1 , numcol iline(icol) = blank ENDDO airow = irow xupper = xmax + (1.5_wp-airow)*xrwidt xlable = xmax + (1.0_wp-airow)*xrwidt xlower = xmax + (0.5_wp-airow)*xrwidt IF ( irow==numrow ) xlable = xmin DO i = 2 , N im1 = i - 1 IF ( X(im1)<cutoff ) THEN IF ( X(i)<cutoff ) THEN IF ( xlower<=X(i) .AND. X(i)<xupper ) THEN icol = ((X(im1)-xmin)/xcwidt) + 1.5_wp iline(icol) = alphax ENDIF ENDIF ENDIF ENDDO icolmx = 1 DO icol = 1 , numcol IF ( iline(icol)==alphax ) icolmx = icol ENDDO iaxisc = alphai IF ( irow==1 .OR. irow==numrow ) iaxisc = hyphen IF ( irow==numr25 .OR. irow==numr50 .OR. irow==numr75 ) & & iaxisc = hyphen WRITE (G_IO,99008) xlable , iaxisc , (iline(icol),icol=1,icolmx) 99008 FORMAT (' ',E14.7,1X,A1,2X,50A1) ENDDO ! ! SKIP 1 LINE FOR A BOTTOM MARGIN WITHIN THE PLOT, WRITE OUT THE ! BOTTOM HORIZONTAL AXIS, AND WRITE OUT THE X AXIS LABELS. ! WRITE (G_IO,99014) blank DO icol = 1 , numcol iline(icol) = hyphen ENDDO DO icol = 1 , numcol , ixdel iline(icol) = alphai ENDDO WRITE (G_IO,99013) (iline(icol),icol=1,numcol) DO i = 1 , numlab aim1 = i - 1 x2labl(i) = xmin + (aim1/anumlm)*delx ENDDO WRITE (G_IO,99009) (x2labl(i),i=1,numlab) 99009 FORMAT (' ',9X,5E12.4) ! 99010 FORMAT (' ','**********************************************************************') 99011 FORMAT (' ',' FATAL ERROR ') 99012 FORMAT (' ','THE ',A4,A4,' INPUT ARGUMENT TO THE ',A4,A4, ' SUBROUTINE') 99013 FORMAT (' ',18X,54A1) 99014 FORMAT (' ',15X,A1) ! END SUBROUTINE PLTXXT