PLOTXX Subroutine

public subroutine PLOTXX(X, N)

NAME

plotxx(3f) - [M_datapac:LINE_PLOT] generate a line printer lag plot

SYNOPSIS

   SUBROUTINE PLOTXX(X,N)

DESCRIPTION

plotxx(3f) yields a one-page printer plot of x(i) versus x(i-1).

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_plotxx
use M_datapac, only : plotxx
implicit none
! call plotxx(x,y)
end program demo_plotxx

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

Common Blocks

HIST (subroutine)
PLOT10 (subroutine)
PLOT6 (subroutine)
PLOT7 (subroutine)
PLOT8 (subroutine)
PLOT9 (subroutine)
PLOTC (subroutine)
PLOTCO (subroutine)
PLOT (subroutine)
PLOTSC (subroutine)
PLOTS (subroutine)
PLOTSP (subroutine)
PLOTU (subroutine)
PLOTX (subroutine)
HIST (subroutine)
PLOT10 (subroutine)
PLOT6 (subroutine)
PLOT7 (subroutine)
PLOT8 (subroutine)
PLOT9 (subroutine)
PLOTC (subroutine)
PLOTCO (subroutine)
PLOT (subroutine)
PLOTSC (subroutine)
PLOTS (subroutine)
PLOTSP (subroutine)
PLOTU (subroutine)
PLOTX (subroutine)
PLOTXX (subroutine)
"> common /BLOCK1/

Type Attributes Name Initial
integer :: IGRaph(55,130)

Source Code

SUBROUTINE PLOTXX(X,N)
REAL(kind=wp) :: aim1 , cutoff , hold , ratiox , ratioy , X , x25 , x75 ,     &
     &     xmax , xmid , xmin , ylable , ymax , ymin
INTEGER :: i , iflag , im1 , ip2 , j , k , mx , my , N
!
!     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 ONE-page PRINTER PLOT OF X(I) VERSUS X(I-1).
!     PRINTING--YES.
!     RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE
!                   OF N FOR THIS SUBROUTINE.
!     MODE OF INTERNAL OPERATIONS--.
!     COMMENT--VALUES IN THE INPUT 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 PLOTXX
!              SUBROUTINE.
!     ORIGINAL VERSION--JUNE      1972.
!     UPDATED         --OCTOBER   1974.
!     UPDATED         --NOVEMBER  1974.
!     UPDATED         --JANUARY   1975.
!     UPDATED         --JULY      1975.
!     UPDATED         --SEPTEMBER 1975.
!     UPDATED         --OCTOBER   1975.
!     UPDATED         --NOVEMBER  1975.
!     UPDATED         --FEBRUARY  1976.
!     UPDATED         --FEBRUARY  1977.
!
!---------------------------------------------------------------------
!
CHARACTER(len=4) :: IGRaph
CHARACTER(len=4) :: sbnam1 , sbnam2
CHARACTER(len=4) :: alph11 , alph12 , alph21 , alph22
CHARACTER(len=4) :: blank , hyphen , alphai , alphax
CHARACTER(len=4) :: alpham , alphaa , alphad , alphan , equal
!
      DIMENSION X(:)
      DIMENSION ylable(11)
      COMMON /BLOCK1/ IGRaph(55,130)
!
      DATA sbnam1 , sbnam2/'PLOT' , 'XX  '/
      DATA alph11 , alph12/'FIRS' , 'T   '/
      DATA alph21 , alph22/'SECO' , 'ND  '/
      DATA blank , hyphen , alphai , alphax/' ' , '-' , 'I' , 'X'/
      DATA alpham , alphaa , alphad , alphan , equal/'M' , 'A' , 'D' ,  &
     &     'N' , '='/
!
      cutoff = (10.0_wp**10) - 1000.0_wp
!
!     CHECK THE INPUT ARGUMENTS FOR ERRORS
!
      WRITE (G_IO,99001)
99001 FORMAT ('1')
      IF ( N<1 ) THEN
         WRITE (G_IO,99011)
         WRITE (G_IO,99012)
         WRITE (G_IO,99013) alph21 , alph22 , sbnam1 , sbnam2
         WRITE (G_IO,99002) N
99002    FORMAT (' ','IS NON-NEGATIVE (WITH VALUE = ',I0,')')
         WRITE (G_IO,99011)
         RETURN
      ELSE
         IF ( N==1 ) THEN
            WRITE (G_IO,99011)
            WRITE (G_IO,99012)
            WRITE (G_IO,99013) alph21 , alph22 , sbnam1 , sbnam2
            WRITE (G_IO,99003) N
99003       FORMAT (' ','HAS THE VALUE 1')
            WRITE (G_IO,99011)
            RETURN
         ELSE
!
            hold = X(1)
            DO i = 2 , N
               IF ( X(i)/=hold ) GOTO 50
            ENDDO
            WRITE (G_IO,99011)
            WRITE (G_IO,99012)
            WRITE (G_IO,99013) alph11 , alph12 , sbnam1 , sbnam2
            WRITE (G_IO,99004) hold
99004       FORMAT (' ','HAS ALL ELEMENTS = ',E15.8)
            WRITE (G_IO,99011)
            RETURN
         ENDIF
!
 50      DO i = 1 , N
            IF ( X(i)<cutoff ) GOTO 100
         ENDDO
         WRITE (G_IO,99011)
         WRITE (G_IO,99012)
         WRITE (G_IO,99013) alph11 , alph12 , sbnam1 , sbnam2
         WRITE (G_IO,99005)
99005    FORMAT (' ','HAS ALL ELEMENTS IN EXCESS OF THE CUTOFF')
         WRITE (G_IO,99006) cutoff
99006    FORMAT (' ','VALUE OF ',E15.8)
         WRITE (G_IO,99011)
         RETURN
      ENDIF
!
!-----START POINT-----------------------------------------------------
!
!     DETERMINE THE VALUES TO BE LISTED ON THE LEFT VERTICAL AXIS
!
 100  DO i = 1 , N
         IF ( X(i)<cutoff ) THEN
            ymin = X(i)
            ymax = X(i)
            EXIT
         ENDIF
      ENDDO
      DO i = 1 , N
         IF ( X(i)<cutoff ) THEN
            IF ( X(i)<ymin ) ymin = X(i)
            IF ( X(i)>ymax ) ymax = X(i)
         ENDIF
      ENDDO
      DO i = 1 , 9
         aim1 = i - 1
         ylable(i) = ymax - (aim1/8.0_wp)*(ymax-ymin)
      ENDDO
!
!     DETERMINE THE VALUES TO BE LISTED ON THE BOTTOM HORIZONTAL AXIS.
!     DETERMINE XMIN, XMAX, XMID, X25 (=THE 25% POINT), AND
!     X75 (=THE 75% POINT).
!
      xmin = ymin
      xmax = ymax
      xmid = (xmin+xmax)/2.0_wp
      x25 = 0.75_wp*xmin + 0.25_wp*xmax
      x75 = 0.25_wp*xmin + 0.75_wp*xmax
!
!     BLANK OUT THE GRAPH
!
      DO i = 1 , 45
         DO j = 1 , 109
            IGRaph(i,j) = blank
         ENDDO
      ENDDO
!
!     PRODUCE THE VERTICAL AXES
!
      DO i = 3 , 43
         IGRaph(i,5) = alphai
         IGRaph(i,109) = alphai
      ENDDO
      DO i = 3 , 43 , 5
         IGRaph(i,5) = hyphen
         IGRaph(i,109) = hyphen
      ENDDO
      IGRaph(3,1) = equal
      IGRaph(3,2) = alpham
      IGRaph(3,3) = alphaa
      IGRaph(3,4) = alphax
      IGRaph(23,1) = equal
      IGRaph(23,2) = alpham
      IGRaph(23,3) = alphai
      IGRaph(23,4) = alphad
      IGRaph(43,1) = equal
      IGRaph(43,2) = alpham
      IGRaph(43,3) = alphai
      IGRaph(43,4) = alphan
!
!     PRODUCE THE HORIZONTAL AXES
!
      DO j = 7 , 107
         IGRaph(1,j) = hyphen
         IGRaph(45,j) = hyphen
      ENDDO
      DO j = 7 , 107 , 25
         IGRaph(1,j) = alphai
         IGRaph(45,j) = alphai
      ENDDO
      DO j = 20 , 107 , 25
         IGRaph(1,j) = alphai
         IGRaph(45,j) = alphai
      ENDDO
!
!     DETERMINE THE (X,Y) PLOT POSITIONS
!
      ratioy = 40.0_wp/(ymax-ymin)
      ratiox = 100.0_wp/(xmax-xmin)
      DO i = 2 , N
         im1 = i - 1
         IF ( X(i)<cutoff ) THEN
            IF ( X(im1)<cutoff ) THEN
               mx = ratiox*(X(im1)-xmin) + 0.5_wp
               mx = mx + 7
               my = ratioy*(X(i)-ymin) + 0.5_wp
               my = 43 - my
               IGRaph(my,mx) = alphax
            ENDIF
         ENDIF
      ENDDO
!
!     WRITE OUT THE GRAPH
!
      WRITE (G_IO,99007)
!
99007 FORMAT (' ',                                                      &
     &'THE FOLLOWING IS A PLOT OF X(I) (VERTICALLY) VERSUS X(I-1) (HORIZ&
     &ONTALLY)')
      DO i = 1 , 45
         ip2 = i + 2
         iflag = ip2 - (ip2/5)*5
         k = ip2/5
         IF ( iflag/=0 ) WRITE (G_IO,99008) (IGRaph(i,j),j=1,109)
99008    FORMAT (' ',20X,109A1)
         IF ( iflag==0 ) WRITE (G_IO,99009) ylable(k) ,                  &
     &                          (IGRaph(i,j),j=1,109)
99009    FORMAT (' ',F20.7,109A1)
      ENDDO
      WRITE (G_IO,99010) xmin , x25 , xmid , x75 , xmax
99010 FORMAT (' ',14X,F20.7,5X,F20.7,5X,F20.7,5X,F20.7,1X,F20.7)
!
99011 FORMAT (' ','**************************************************', &
     &        '********************')
99012 FORMAT (' ','                   FATAL ERROR                    ')
99013 FORMAT (' ','THE ',A4,A4,' INPUT ARGUMENT TO THE ',A4,A4,         &
     &        ' SUBROUTINE')
!
END SUBROUTINE PLOTXX