PLTXXT Subroutine

public subroutine PLTXXT(X, N)

NAME

pltxxt(3f) - [M_datapac:LINE_PLOT] generate a line printer lag plot
for the terminal (71 characters wide)

SYNOPSIS

   SUBROUTINE PLTXXT(X,N)

DESCRIPTION

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.

OPTIONS

 X   description of parameter
 Y   description of parameter

EXAMPLES

Sample program:

program demo_pltxxt
use M_datapac, only : pltxxt
implicit none
! call pltxxt(x,y)
end program demo_pltxxt

Results:

AUTHOR

The original DATAPAC library was written by James Filliben of the
Statistical Engineering Division, National Institute of Standards
and Technology.

MAINTAINER

John Urban, 2022.05.31

LICENSE

CC0-1.0

REFERENCES

  • FILLIBEN, ‘SOME USEFUL PROCEDURES FOR THE STATISTICAL ANALYSIS OF DATA’, UNPUBLISHED MANUSCRIPT (AVAILABLE FROM AUTHOR) PRESENTED AT THE FALL CONFERENCE OF THE CHEMICAL DIVISION OF THE AMERICAN SOCIETY FOR QUALITY CONTROL, KNOXVILLE, TENNESSEE, OCTOBER 19-20, 1972.
  • FILLIBEN, ‘DATA EXPLORATION USING STAND-ALONE SUBROUTINES’, UNPUBLISHED MANUSCRIPT (AVAILABLE FROM AUTHOR) PRESENTED AT THE ‘STRATEGY FOR DATA ANALYSIS BY COMPUTERS’ SESSION AT THE NATIONAL MEETING OF THE AMERICAN STATISTICAL ASSOCIATION, ST. LOUIS, MISSOURI, AUGUST 26-29, 1974.

Arguments

Type IntentOptional Attributes Name
real(kind=wp), dimension(:) :: X
integer :: N

Source Code

      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