A data-plotting and regression tool. The user enters up to 50 X/Y pairs, a graph title, axis labels, axis ranges and tick intervals, then chooses a plotting character (dot, asterisk or plus) and whether points are joined by straight lines. The graph is drawn with tick marks and scale numbers and can be copied to the printer. A regression option reports slope, intercept, the fitted equation and the correlation coefficient, and can evaluate the equation for any X.
The menu header reads “Graph It by Paul Bates.”
Program Analysis
Program Structure
The menu at lines 10–160 jumps with GO TO A*1000: 1000 data entry (with a correction routine at 6000 and an optional printed table), 2000 plot character, 3000 plot type, 4000 drawing, 5000 regression. Option 6 stops.
Plotting and Regression
Axes are drawn from pixel (48,32) with PLOT/DRAW; points are placed as characters with PRINT AT, and in line mode consecutive points are joined with DRAW. The regression at 5000 accumulates Σx, Σy, Σx², Σy² and Σxy and applies the least-squares formulas.
Notable Techniques
- The fitted line is stored as the string
V$="N3*X+(S3)"and evaluated withVAL V$for each X the user enters. POKE 23658,8switches on caps lock at start-up.- The Y-axis label is printed vertically one character per row.
Potential Issues
- Point positions are rounded to character cells, while the joining lines are converted back to pixels, so lines and point markers do not always meet exactly.
- Line 5400 saves under the name “GRAPH 2” while line 7000 saves as “GRAPH IT”.
Source Code
10 BORDER 3: PAPER 6: INK 0: CLS
11 POKE 23658,8
20 PRINT AT 1,3; INVERSE 1;" GRAPH IT BY PAUL BATES ": INVERSE 0
30 PRINT AT 3,11; INVERSE 1;" MENU ": INVERSE 0
40 PRINT AT 5,2;"1 - ENTER DATA(4 DIGITS MAX.)"
50 PRINT AT 7,2;"2 - CHOOSE DOT CHARACTER"
60 PRINT AT 9,2;"3 - CHOOSE PLOT TYPE"
70 PRINT AT 11,2;"4 - DRAW GRAPH"
80 PRINT AT 13,2;"5 - REGRESSION ANALYSIS"
90 PRINT AT 15,2;"6 - QUIT PROGRAM"
100 PRINT AT 18,1;"ENTER OPTION-0-RETURNS TO MENU"
110 INPUT Z$
120 IF Z$>"6" THEN GO TO 110
125 IF Z$="6" THEN STOP
130 LET A=VAL Z$
140 CLS
150 IF A=0 THEN GO TO 10
160 GO TO A*1000
1000 BORDER 2: PAPER 1: INK 7: CLS
1010 DIM B(50): DIM X(50): DIM Y(50): DIM A$(16): DIM B$(10): DIM C$(10): DIM D$(1)
1020 PRINT AT 1,5; INVERSE 1;" 1-DATA ENTRY ": INVERSE 0
1025 LET G=0: LET H=0
1030 PRINT AT 3,2;"NO. OF DATA PAIRS? :"
1040 BEEP .5,20: INPUT B
1045 IF B=0 THEN GO TO 1500
1050 PRINT AT 3,22;B
1060 FOR I=1 TO B
1070 PRINT AT 5,5;"X";I;" ="
1080 INPUT X(I)
1090 PRINT AT 5,9;X(I)
1100 BEEP .1,20
1110 PRINT AT 10,5;"Y";I;" ="
1120 INPUT Y(I)
1130 PRINT AT 10,9;Y(I)
1140 BEEP .1,20
1145 PAUSE 100
1150 PRINT AT 5,9;" ": PRINT AT 10,9;" "
1160 NEXT I
1162 CLS : PRINT TAB 7;"X";TAB 12;"Y"
1164 PRINT TAB 7;"---";TAB 12;"---"
1165 FOR I=1 TO B
1166 PRINT TAB 7;X(I);TAB 12;Y(I)
1167 NEXT I
1169 INPUT "ALL OK? (Y/N)?";G$
1170 CLS : IF G$<>"Y" THEN GO TO 6000
1175 PRINT AT 12,1;"GRAPH TITLE: "
1180 INPUT A$
1190 PRINT AT 12,14;A$
1200 PRINT AT 14,1;"X-AXIS LABEL: "
1210 INPUT B$
1220 PRINT AT 14,15;B$
1230 PRINT AT 16,1;"Y-AXIS LABEL: "
1240 INPUT C$
1250 PRINT AT 16,15;C$
1260 PRINT AT 18,1;"X-MIN="
1270 INPUT C
1280 PRINT AT 18,7;C
1290 PRINT AT 18,12;"X-MAX="
1300 INPUT D
1310 PRINT AT 18,18;D
1320 PRINT AT 20,1;"Y-MIN="
1330 INPUT E
1340 PRINT AT 20,7;E
1350 PRINT AT 20,12;"Y-MAX="
1360 INPUT F
1370 PRINT AT 20,18;F
1375 INPUT "ALL OK? (Y/N)";G$
1378 IF G$<>"Y" THEN GO TO 1175
1380 PAUSE 100
1390 CLS
1400 PRINT AT 5,2;"X TIC-MARK INTERVAL?"
1410 INPUT Y
1420 PRINT AT 5,25;Y
1430 PRINT AT 10,2;"Y TIC-MARK INTERVAL?"
1440 INPUT Z
1450 PRINT AT 10,25;Z
1455 INPUT "ALL OK? (Y/N)";G$
1458 IF G$<>"Y" THEN GO TO 1390
1460 PAUSE 100
1500 CLS : PRINT AT 5,1; INVERSE 1;"DO YOU WISH TO HAVE A COPY OF"
1510 PRINT AT 7,1; INVERSE 1;"THE DATA PAIRS ENTERED? "
1520 PRINT AT 11,2; INVERSE 1; FLASH 1;"ENTER Y OR N"
1530 INPUT D$
1540 IF D$<>"Y" THEN GO TO 10
1542 LPRINT TAB 6;"TITLE :";A$
1544 LPRINT
1550 LPRINT TAB 10;"X";" ";"Y"
1560 LPRINT TAB 9;"---";" ";"---"
1570 FOR I=1 TO B
1580 LPRINT TAB 9;X(I);" ";Y(I)
1590 NEXT I
1600 GO TO 10
2000 BORDER 4: PAPER 6: INK 2: CLS
2010 REM CHARACTER LETTER IS G
2020 PRINT AT 1,5; INVERSE 1;" CHARACTER SHAPE ? ": LET G=0
2030 PRINT AT 4,2;"OPTION 1: ."
2040 PRINT AT 8,2;"OPTION 2: *"
2050 PRINT AT 12,2;"OPTION 3: +"
2060 PRINT AT 14,1; INVERSE 1; FLASH 1;" ENTER YOUR CHOICE (1,2 OR 3) "
2070 INPUT G
2080 IF G=1 THEN LET G=46
2090 IF G=2 THEN LET G=42
2100 IF G=3 THEN LET G=43
2110 PRINT AT 18,2;"YOUR CHOICE IS"
2120 PRINT AT 18,16;CHR$ G
2130 PAUSE 150
2140 GO TO 10
3000 BORDER 5: PAPER 7: INK 2: CLS
3010 PRINT AT 1,5; INVERSE 1;" PLOT CHOICE ? ": LET H=0
3020 PRINT AT 5,2;"OPTION 1: POINTS ONLY"
3030 PRINT AT 10,2;"OPTION 2: POINTS JOINED BY"
3040 PRINT AT 11,12;"STRAIGHT LINES"
3050 PRINT AT 15,4; INVERSE 1; FLASH 1;" ENTER YOUR CHOICE "
3060 INPUT H
3070 IF H<1 OR H>2 THEN GO TO 3050
3080 GO TO 10
4000 IF G=0 THEN LET G=46
4002 IF H=0 THEN LET H=1
4005 BORDER 5: PAPER 7: INK 0: CLS
4010 LET I=48: LET J=32
4020 PLOT I,J: DRAW 0,120
4030 PLOT I,J: DRAW 200,0
4040 LET K=17
4050 PLOT I,J: DRAW -3,0
4060 LET L=(F-E)/Z
4070 FOR A=1 TO L
4080 LET J=J+INT (120/L)
4090 PLOT I,J: DRAW -3,0
4100 NEXT A
4110 IF F>0 THEN LET L=(F-E)/Z: IF F<0 THEN LET L=(((E-F)/Z)*-1)
4115 LET Q=E
4120 FOR I=1 TO L+1
4130 PRINT AT K,2;Q
4140 LET Q=(Q+Z)
4150 LET K=(K-(17/(L+1)))
4160 NEXT I
4170 LET I=48: LET J=32
4180 LET L2=(D-C)/Y
4190 PLOT I,J: DRAW 0,-3
4200 FOR A=1 TO L2
4210 LET I=I+INT (200/L2)
4220 PLOT I,J: DRAW 0,-3
4230 NEXT A
4240 IF D>0 THEN LET L2=(D-C)/Y: IF D<0 THEN LET L2=((D-C)/Y)*-1
4250 LET K2=5: LET W=C
4260 FOR A=1 TO L2+1
4270 PRINT AT 19,K2;W
4280 LET W=(W+Y)
4290 LET K2=INT K2+(30/(L2+1))
4300 NEXT A
4310 PRINT AT 21,8;B$
4320 PRINT AT 0,8;A$
4330 REM Y-AXIS TITLE
4340 LET M=6
4350 FOR I=1 TO 10
4360 PRINT AT M,0;C$(I)
4370 LET M=M+1
4380 NEXT I
4390 LET N=0: LET N=N+C
4400 LET N2=0: LET N2=N2+E
4420 REM PLOT POINTS
4430 LET P0=32: LET O0=48
4440 FOR A=1 TO B
4450 LET O=((X(A)-N)/(D-N))
4460 LET O=INT ((O*25)+6)
4470 LET P=((Y(A)-N2)/(F-N2))*15
4480 LET P=INT ((P-17)*-1)
4490 PRINT AT P,O;CHR$ G
4500 IF H=2 THEN GO TO 4700
4510 NEXT A
4520 GO TO 4800
4700 LET Z5=1
4710 LET P1=INT (((P/21)-1)*-175): LET O1=(O*8)
4720 PLOT O0,P0
4730 DRAW (O1-O0),(P1-P0)
4740 LET P0=P1: LET O0=O1
4750 LET Z5=Z5+1: IF Z5=B THEN GO TO 4800
4760 GO TO 4510
4800 DIM E$(1): INPUT "COPY(Y/N)?";E$
4810 IF E$="N" THEN GO TO 10
4820 IF E$="Y" THEN COPY
4830 GO TO 10
5000 BORDER 6: PAPER 4: INK 0: CLS
5010 PRINT AT 1,6; INVERSE 1;"LINEAR REGRESSION"
5020 PRINT AT 4,2;"GRAPH NAME IS ";A$
5030 LET D3=0: LET E3=0: LET F3=0: LET G3=0: LET H3=0
5040 FOR I=1 TO B
5070 LET D3=D3+X(I)
5080 LET E3=E3+Y(I)
5090 LET F3=F3+(X(I)*X(I))
5100 LET G3=G3+(Y(I)*Y(I))
5110 LET H3=H3+(X(I)*Y(I))
5120 NEXT I
5130 LET L3=H3-((D3*E3)/B)
5140 LET M3=F3-((D3*D3)/B)
5150 LET N3=L3/M3
5160 LET O3=D3/B
5170 LET P3=E3/B
5180 LET Q3=SQR (M3*(G3-((E3*E3)/B)))
5190 LET R3=L3/Q3
5200 LET S3=P3-(N3*O3)
5210 PRINT AT 6,2;"THE SLOPE IS: ";N3
5220 PRINT AT 8,2;"THE INTERCEPT IS: ";S3
5230 PRINT AT 10,2;"HENCE THE EQUATION IS: "
5240 PRINT AT 12,5;"Y=";N3;"* X +";S3
5245 LET V$="N3*X+(S3)"
5250 PRINT AT 14,1;"THE CORRELATION COEFFICIENT IS :";R3
5260 PRINT AT 18,2; INVERSE 1;" COPY (Y/N) ?"
5270 DIM J$(1): INPUT J$
5280 IF J$="Y" THEN COPY
5290 PRINT "WANT MORE VALUES OF ""Y"" FOR THE REGRESSION EQUATION? Y/N": INPUT J$
5291 IF J$="Y" OR J$="y" THEN GO TO 5310
5300 GO TO 10
5310 CLS : PRINT "THE REGRESSION EQUATION IS","Y= ";V$;" WHERE N3=SLOPE IS ";N3;" AND S3= INTERCEPT OF ";S3: PRINT : PRINT : INPUT "ENTER VALUE OF X ";X
5315 PRINT "FOR X=";X;" THE VALUE OF Y IS ",VAL V$
5318 LPRINT "FOR X=";X;" THE VALUE OF Y IS ",VAL V$
5320 PRINT : GO TO 5290
5400 SAVE "GRAPH 2" LINE 0
5410 GO TO 100
6000 REM CORRECT X & Y ENTRY
6005 DIM V(50)
6010 INPUT "DO YOU WANT TO CORRECT X OR Y?";Q$
6020 INPUT "WHICH ITEM #?";G
6030 INPUT "ENTER THE NEW VALUE (OF X OR Y)";V
6035 LET I=G
6040 IF Q$="X" THEN LET X(I)=V: LET X(I)=X(I)
6041 IF Q$="Y" THEN LET Y(I)=V: LET Y(I)=Y(I)
6042 FOR I=1 TO B
6043 PRINT TAB 4;I;TAB 10;"X=";X(I);TAB 20;"Y=";Y(I)
6044 NEXT I
6045 PRINT ';"CORRECTION: ";G;".";Q$;"=";V
6050 INPUT "ANOTHER CORRECTION? Y/N?";Z$
6060 IF Z$="Y" THEN GO TO 6000
6070 CLS : GO TO 1175
7000 SAVE "GRAPH IT" LINE 0Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.