1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430
|
This is the documentation for PLOT2 (SHARE;PLOT2 USAGE). This is a
long file. If this is your first experience with PLOT2 read
SHARE;PLOT2 PRIMER with contains examples and brief explanations of
the most common PLOT2 capabilities. These examples are run for you by
typing DEMO(PLOT2,DEMO,DSK,SHARE); (type spaces after the plots).
Please look at SHARE;PLOT2 RECENT as well for updates as to the
current state of affairs. (Last revision of this file: August 1981.)
Description of PLOT2
0) Introduction
This is a description of the functions contained in the following 7
files:
APLOT2 > DSK CFFK
TEKPLT > DSK CFFK
PLOT3D > DSK CFFK
WORLD > DSK CFFK
PRINT > DSK CFFK
IFFUN > DSK CFFK
EDIT > DSK CFFK
All of the important functions will get loaded up as needed.
The capabilities of the routines described here include plotting
of several curves on a single graph, plotting several graphs in
different positions on the screen, saving plots, replotting plots
with different scales without having to recompute any points,
plotting of 3 dimensional surfaces, plotting of user defined dashed
lines and symbols.
The devices supported are: The Tektronix 4010, 4013, 4025 and
4662, the Imlac PDS 1 and PDS 4 (using ARDS graphics conventions),
the XGP, the Gould line-printer (in 38-246), the Dover, some
Versatecs on the MFE-NET and in a "preview" mode printing and display
consoles.
Mail concerning bugs/features in PLOT2 should be addressed to
BUG-PLOT2.
Contents:
1) 2D plotting
1) PLOT2
2) GRAPH2
3) PARAMPLOT2
4) WORLDPLOT2
5) PLOTNUM
6) PLOT2ERROR and PLOTUNDEFINED
2) What to type at the end of a plot
1) space
2) return
3) tab
4) linefeed
5) rubout
6) ^A
7) PLOTBELL
8) Quitting
3) 3D plotting
1) PLOT3D
2) GRAPH3D
3) NOT3D
4) PERSPECTIVE, REVERSE, VIEWPT and CENTERPLOT
5) CROSSHATCH and UNDERSIDE
6) HIDE, \3D, CONTOUR and NOT3D
7) PLOTNUM0 and PLOTNUM1
4) Contour plotting
1) CONTOURPLOT2
2) CONTOURS, ZMAX and ZMIN
3) LABELCONTOURS
5) Other plotting functions
1) REPLOT
2) PLOTMODE
3) CLEAR
4) HARDCOPY
5) PLOTRESET
6) Labels
1) XLABEL, YLABEL, TITLE and NONE
2) LABEL
3) NOPRINT
4) PLOTNUMPREC
5) DATEPLOT
7) Axes
1) XAXIS and YAXIS
2) TICKSIZE and TICKNUM
8) Scales
1) WINDOW
2) XMIN, XMAX, YMIN and YMAX
3) EQUALSCALE
4) WINDOW1, XMIN1 etc.
9) Line types
1) TYPEL
2) DEFINEDASH
3) DEFINESYMBOL
10) Plotting several curves
1) CLEAR and WAIT
2) FIRST, LAST and SAME
3) REPLOT4
4) TOP, BOTTOM, LEFT and RIGHT
11) Device characteristics
1) Tektronix
2) Imlac
3) Grinnell
4) Printing and Display
5) XGP
6) Gould
7) Versatec
8) Dover
12) Naming and saving of plots
1) NAMEPLOT
2) SAVEPLOTS
3) LOADPLOTS
4) KILLPLOTS
5) DONT
6) PLOTS
13) Transformations on points
1) POLAR, LOG, LINLOG, LOGLIN, LIN and TXTYPE
2) SPECIAL, XFUN and YFUN
3) 3D transformations and HOWCLOSE
14) Editting plots
1) EDIT
15) Default settings
1) Options
2) Lines and Symbols
3) PLOTMODE
16) Primitives called by PLOT2
17) What PLOT2 doesn't do
18) Other examples
19) Acknowledgements
1) 2D plotting
1) PLOT2
2) GRAPH2
3) PARAMPLOT2
4) WORLDPLOT2
5) PLOTNUM
6) PLOT2ERROR and PLOTUNDEFINED
1.1) PLOT2
Easy examples
PLOT2(SIN(X), X, -%PI, %PI); plots sin(X) against X as X takes on
PLOTNUM values between -%PI to %PI
LST:[1,1,2,3,5,8,13,21,34]; A list of the first Fibbonacci numbers
PLOT2(LST[I], I, 1, LENGTH(LST), INTEGER); plots the elements of
list vs. the integer position in the
list
F(X) := SQRT(X+%PI);
PLOT2(F(X), X, [-2,3,100.12]); plots F(X) as X takes the values in
the values in the list
PLOT2([X+1, X^2+1], X, -1, 1); plots 2 curves on top of each other
Complete description
PLOT2(<y-exprs>, <variable>, <var-range>, <optionals-args>); plots
<y-exprs> as the y axis as <variable> (the x axis) takes on
values specified by <var-range>.
<y-exprs> can take one of two forms:
(i) <expr> plots a curve of <expr> against <variable>;
(ii) [<expr1>, <expr2>, ..., <expri>, ..., <exprn>] plots n
curves of <expri> against <variable>.
<expri> gets evaluated in the following context
FLOAT(EV(<expri>, <variable>=<value gotten from var-range>,
NUMER)).
It is an error if this doesn't result in a floating point number.
<var-range> can have the following forms:
(i) <low>, <high> where <low> and <high> evaluate to numbers.
<low> may be either greater or less than <high>. <variable>
will take on PLOTNUM values equally spaced between <low> and
<high>. Note that the first argument will be evaluated at
<low> first e.g., PLOT2(1/X, X, -1, -3); calculates 1/(-1.0)
before 1/(-3.0). This will only make a difference if the
computation of the first arg changes a variable which changes
the value returned by subsequent computation. Whether or not
<low> < <high>, min(<low>, <high>) will be on the left of the
plot. (This can be overridden using the SPECIAL (Sec 13.2)
option with REFLECT as XFUN.)
(ii) <low>, <high>, INTEGER as in (i) except <variable> will take
on all integer values between <low> and <high> inclusive.
(iii) [<val1>, <val2>, ..., <vali>, ..., <valn>] <variable> takes
the values specified by the list.
(iv) <arrayname> where <arrayname> is the name of a declared
floating-point one-dimensional array (i.e., by
ARRAY(<arrayname>, FLOAT, <max-index>);). <variable> takes
the values from <arrayname>[0] thru <arrayname>[<max-index>]
(<max-index> is the maximum index of <arrayname>
<optional-args> can be any of the following:
X-Label, Y-Label or Title descriptor (Sec 6.1),
Line type descriptor (Sec 9.1),
FIRST, SAME and LAST (Sec 10.2),
POLAR, LOG, LINLOG, LOGLIN (Sec 13.1),
TOP, BOTTOM, LEFT, or RIGHT (Sec 10.4).
The optional arguments may appear in any order. The rule for
evaluation of the optional args is as follows. If the argument is
atomic it gets evaluated. The resulting arguments are the ones
that get used.
If you want to plot more than 3-4 curves on the same plot investigate
using the NOT3D option to PLOT3D (Sec 3.3).
PLOT2(<y-funs>, <var-range>, <optionals-args>); The alternative form
for PLOT2. <y-funs> must be a function of 1 argument or a list of
functions of 1 argument. The functions must be either translated
or compiled function which returns a floating point number when
it is given floating point arg (or integer arg if the INTEGER arg
to PLOT2 is given). This form of PLOT2 acts as though you had
given a argument to the <y-funs>, and also specified that
argument as the <variable> in the form above. e.g., PLOT2(F, -2,
2); acts like PLOT2(F(X), X, -2, 2); This is supposed to provide
a quicker evaluation of the first arg and for that reason NO
checking is done on the result. If the wrong sort of number is
returned, you will get garbage plotted.
Examples
TRANSLATE:TRUE;
F(X) := (MODEDECLARE(X, FLOAT), EXP(-X*X));
PLOT2(F, -2, 2);
PLOT2(F, [-2,-1,0,1,2]);
ARRAY(V, FLOAT, 10);
FOR I FROM 0 THRU 10 DO V[I]:FLOAT(I-5);
PLOT2(F, V);
1.2) GRAPH2
Easy examples
GRAPH2([1,2,3], [5,10,6]); draws a line connecting [1,5], [2,10],
[3,6]
Complete description
GRAPH2(<x-lists>, <y-lists>, <optional-args>); plots points specified
by the first <x-lists> and <y-lists>
The format for <x-lists> can be one of:
(i) [<x-pt1>, <x-pt2>, ..., <x-pti>, ..., <x-ptn>] where <x-pti>
evaluates to a number.
(ii) <arrayname> where <arrayname> is the name of a declared
one-dimensional array of floating point numbers.
(iii) <2d-arrayname> where <2d-arrayname> is the name of a
declared two-dimensional array of floating point numbers
(i.e., by ARRAY(<2d-arrayname>, FLOAT, <max-row-index>,
<max-col-index>);).
(iv) [<x-list1>, <x-list2>, ..., <x-listi>, ..., <x-listk>] where
<x-listi> can have the form of either (i) or (ii).
The format of <y-lists> is similar. GRAPH2 performs as follows:
arguments of form (i) or (ii) are converted to form (iv) (e.g.,
<arrayname> ==> [<arrayname>]). Arguments of form (iii) are
converted to form (iv) by <2d-arrayname> ==> [<row0>, <row1>,
..., <rowi>, ..., <rowk>] where <rowi> is a list of the numbers
in the i'th row of <2d-arrayname> (remember that array indexing
begins from 0 in MACSYMA). If the length of the resulting
<x-lists> is shorter than that of the resulting <y-lists> then
<x-lists> is filled with <x-listk> to make the lengths the same
(similarly if <y-lists> is shorter than <x-lists>). If the length
of <y-lists> is, say, n, then n curves of <x-list1> vs.
<y-list1>, ..., <x-listn> vs. <y-listn> are plotted. In the event
of <x-listi> containing less numbers (or being a shorter array)
than <y-listi> then the last numbers of <y-listi> are left
unused.
The <optional-args> is the same as for PLOT2.
Note that GRAPH2 performs the same job as the MACSYMA function
MULTIGRAPH and that GRAPH2 is thus slightly incompatible with
GRAPH
1.3) PARAMPLOT2
Easy example
PARAMPLOT2(COS(T), SIN(T), T, 0, 2*%PI); Plots cos(T) for the
x-axis and sin(T) for the y-axis as T takes on PLOTNUM (Sec
1.5) values between 0 and 2*%PI. (If EQUALSCALE is TRUE (Sec
8.3) this draws a circle.)
Complete description
PARAMPLOT2(<x-exprs>, <y-exprs>, <variable>, <var-range>,
<optional-args>); plots <x-exprs> as the x coordinate against
<y-exprs> as the y coordinate.
The format for the first two arguments is the same as that for the
first argument to PLOT2. Thus if <x-exprs> is [<x-expr1>,
<x-expr2>, ..., <x-expri>, ..., <x-exprn>] and <y-exprs> is
[<y-expr1>, <y-expr2>, ..., <y-expri>, ..., <y-exprk>], then
max(n,k) curves will be plotted. they will be (assuming n > k):
<x-expr1> vs. <y-expr1>, ..., <x-exprk> vs. <y-exprk>,
<x-expr(k+1)> vs. <y-exprk>, ..., <x-exprn> vs. <y-exprk>.
The format for the remaining arguments is the same as for PLOT2.
PARAMPLOT2(<x-funs>, <y-funs>, <var-range>, <optional-args>);
efficiently evaluates its first 2 arguments in the same way that
the alternative form of PLOT2 works.
Example
TRANSLATE:TRUE; causes automatic translation
F(X) := (MODEDECLARE(X, FLOAT), COS(X));
G(X) := (MODEDECLARE(X, FLOAT), SIN(X));
PARAMPLOT2(F, G, 0, 2*%PI); plots F(x) vs G(x) as x goes from 0 to
2*%PI (this is the same as the easy example at the beginning
of this section).
1.4) WORLDPLOT2
Easy example
LOAD('[WORLD, FASL, DSK, SHARE]);
WORLDPLOT(-15, 10, 48, 60); draws a map of the United Kingdom.
Complete description
WORLDPLOT(<min-long>, <max-long>, <min-lat>, <max-lat>); plots your
favorite portion of the world. The arguments are in degrees with
latitude ranging from -90 to 90 and longitude from -180 to 180.
the projection is unorthodox. (The function is just a hack, don't
expect any of the features available with the other plotting
functions to be available. Note too that WORLDPLOT has no
auto-load property. It must be explicitly loaded by LOAD('[WORLD,
FASL, DSK, SHARE]); )
1.5) PLOTNUM
This is the number of points PLOT2 and PARAMPLOT2 plot when given the
<low>, <high> type of variable range. The default value is 20.
1.6) PLOT2ERROR and PLOTUNDEFINED
PLOT2ERROR governs what happens when PLOT2 hits an error in trying to
evaluate a point. If PLOT2ERROR is TRUE (the default) an error
occurs and PLOT2 exits. However if DEBUGMODE is TRUE you can ask
for the value of PLOT2ERROR which is temporally bound to the form
being evaluated when the error occurs. If PLOT2ERROR is a
floating point number then that number will be used as the value
of the erroneous form. If PLOT2ERROR is FALSE, then the result is
the value of PLOTUNDEFINED (i.e., it is the same as PLOT2ERROR :
PLOTUNDEFINED;). This causes the point to be skipped in the
plotting.
PLOTUNDEFINED enables you to plot functions which are undefined in
certain ranges of their arguments. If the function that is being
plotted returns the value PLOTUNDEFINED (which happens to be some
large "random" number), then that point will not be plotted at
all and the line will be discontinuous. This is to implement
inhibition of plotting in areas of discontinuities, or where the
function is undefined. This feature is only implemented for
two-dimensional graphs in PLOT2. These are plots produced by
PLOT2, PARAMPLOT2 and GRAPH2.
Example
PLOT2ERROR:FALSE; plot no point on an error
PLOT2([SQRT(X^2-1.), -SQRT(X^2-1.)], X, -3, 3); plot a curve of
+/- sqrt(X^2-1). Such cases are usually more satisfactorily
handled by parameterizing the curve and using PARAMPLOT2. E.g.,
PARAMPLOT2([COSH(T), -COSH(T)], SINH(T), T, -ACOSH(3), ACOSH(3));
2) What to type at the end of a plot
1) space
2) return
3) tab
4) linefeed
5) rubout
6) ^A
7) PLOTBELL
8) Quitting
When a plot is finished the bell on your terminal will be dinged.
(This only in fact happens if WAIT is TRUE (Sec 10.1) and if you're
plotting on the terminal (Sec 5.2) and (Sec 11).) The plotting
function is now waiting for you to type something before it exits and
prints the next C-Label on your nice plot. It does nothing with most
characters; they are left to be part of the next C-Line. However the
following characters are read and interpreted specially.
2.1) space
This is read and the plotting function exited. This is the "normal"
means of exitting.
2.2) return
Clears the screen and then exits. This is disabled by setting
CRCLEAR:TRUE; (default value is FALSE). This switch is mainly for
people coming through another computer which works a
line-at-a-time (so that they have to terminate all their MACSYMA
commands with e.g., ";<cr>"). CRCLEAR is not reset by
PLOTRESET();.
2.3) tab
The previous plot is replotted. This is useful if the line is noisy,
or, in conjunction with ^A (Sec 2.6) if various of the plotting
parameters need to be changed. Note however that <tab> only
affects the last call to one of the main plotting functions
(PLOT2, PLOT3D, etc.). Thus, it cannot be used to replot all the
plots in a sequence of plots generated by (PLOT2(..., FIRST),
..., PLOT2(..., LAST)); (Sec 10.2).
2.4) linefeed
Sends out a hardcopy signal by calling the HARDCOPY() function (Sec
5.4). (This doesn't happen with HARDCOPY:TRUE; (Sec 5.4) because
then you get an automatic HARDCOPY() with each plot.)
2.5) rubout
Names the plot. PLOT2 types out "Enter name of plot" you reply
<plotname>; this is identical to typing a space instead of a
rubout, followed by NAMEPLOT(<plotname>); (Sec 12.1).
2.6) ^A
This is not really read by the plotting function, but enables you to
enter a ^A break and change various options, before typing tab to
have the plot replotted. Make sure the plot has finished before
you type this (Sec 2.8). The most common things that need
changing are the scaling options (Sec 8); but just about anything
can be changed as long as they don't require that more points be
calculated (e.g., don't try resetting PLOTNUM in a ^A break).
There are a number of options that exist as explicit options only
within a ^A break of this type. (Normally they are set in the
<optional-args> of the plotting function.) They are TYPEL (Sec
9.1), XLABEL, YLABEL, TITLE (Sec 6.1), TXTYPE (Sec 13.1) and \3D
(Sec 3.6). Unlike the other options these are local variables and
will become unbound (or bound to their old values) when PLOT2 is
exitted and in order for the changes made to them to be
remembered by REPLOT (Sec 5.1) later on you must replot the plot
after exiting the break. In order to get your plot replotted in
the new environment you have set up, just type EXIT; followed by
a tab.
2.7) PLOTBELL
If you find the dinging of the bell annoying, you can shut it off by
doing PLOTBELL:FALSE; (Its default value is TRUE.)
2.8) Quitting
While your plot is coming out your terminal is in a rather strange
state (e.g., not echoing characters). Thus it is OK to type ahead
to Macsyma, but the ONLY way you should interrupt the plot is
with ^G. E.g., do not use ^A until the plot has finished.
Note: The chars to create a plot get put in a buffer and normally
only get sent when the buffer is full or when the plot is complete.
The user can force the buffer contents to be sent by typing ^\
(control-shift-L on the Tektronix, control-\ on the imlac). (This is
probably only of use to to users of WORLDPLOT, which because of its
ridiculously inefficient implementation will sometimes wait until it
has gone thru the whole world before sending anything out.) Note
however that this feature is not reliable.
3) 3D plotting
1) PLOT3D
2) GRAPH3D
3) NOT3D
4) PERSPECTIVE, REVERSE, VIEWPT and CENTERPLOT
5) CROSSHATCH and UNDERSIDE
6) HIDE, \3D, CONTOUR and NOT3D
7) PLOTNUM0 and PLOTNUM1
3.1) PLOT3D
Easy example
PLOT3D(EXP(-X^2-Y^2)*X, X, -2, 2, Y, -1.5, 2.5); Plots
exp(-X^2-Y^2)*X as X takes on PLOTNUM values between -2 and 2
and y takes on PLOTNUM1 values between -1.5 and 2.5.
Complete description
PLOT3D(<z-exprs>, <x-var>, <var-range>, <y-var>, <var1-range>,
<optional-args>); makes a 3 dimensional plot of <z-exprs> against
<x-var> and <y-var>. the plot consists of curves of <y-exprs>
against <x-var> (the x coordinate) with <y-var> (the y
coordinate) held fixed. Perspective is used and curves further
away from the viewer have those parts of them which are hidden by
the closer curves removed.
The format of <y-exprs> is the same as for PLOT2. The context of
evaluation is FLOAT(EV(<expri>, <x-var>=<value gotten from
var-range>, <y-var>=<value gotten from var1-range>, NUMER))
The format for <var-range> and <var1-range> is the same as for PLOT2
except that if <var1-range> is of the form <low>, <high> then
<y-var> will take on PLOTNUM1 values.
The format of <optional-args> is the same as for PLOT2 except that an
additional options NOT3D (Sec 3.3), \3D, CONTOUR are available
(Sec 3.6).
PLOT3D(<z-funs>, <var-range>, <var1-range>, <optional-args>); This is
analogous to the alternative form for PLOT2. <z-funs> must be a
function or list of functions of 2 arguments, which must return a
floating point argument when given floating point (integer, if
the INTEGER argument is used for either <var-range> or
<var1-range>) arguments. The functions must be translated or
compiled. If you expect to make several 3D plots this form is
recommended.
Easy example
TRANSLATE:TRUE; causes automatic translation
G(X, Y) := (MODEDECLARE([X,Y], FLOAT), EXP(-X*X-Y*Y));
PLOT3D(G, -2, 2, -2, 2); define a function G and plot it
3.2) GRAPH3D
GRAPH3D(<x-lists>, <y-lists>, <z-lists>, <optional-args>); Right now
this is at a fairly rudimentary stage. It takes 3 arguments where
GRAPH2 took 2 and interprets them as lists of x, y and z points
which it uses to draw lines using the 3d transformations. It can
be used to add lines (e.g., axes) to your 3D plot (see SAME option
(Sec 10.2)). The hidden line routines are not used.
3.3) NOT3D
Easy example
PLOT3D(SIN(X)+A, X, -%PI, %PI, A, [-2,3,4,6], NOT3D); plots
sin(X)+A for X from -%PI to %PI (PLOTNUM points) and A taking
the values in the list. This is equivalent to:
PLOT2([SIN(X)-2,SIN(X)+3,SIN(X)+4,SIN(X)+6], X, -%PI, %PI);
but requires less typing.
Complete description
The additional NOT3D argument to PLOT3D, causes exactly the same
points as in the bare PLOT3D to be calculated. Instead of
plotting a 3-dimensional representation of the data, the data is
plotted in a 2D one. Specifically 1 2D curve of z vs. x for each
y value and so is a convenient way to plot several curves on the
same plot.
3.4) PERSPECTIVE, REVERSE, VIEWPT and CENTERPLOT
These options govern the type of perspective view given.
PERSPECTIVE, if FALSE causes a non-perspective view to be taken. This
is equivalent to extending the viewing position out to infinity
along a line connecting the origin and VIEWPT.
REVERSE, if TRUE cause a left-handed coordinate system to be assumed.
VIEWPT and CENTERPLOT determine the perspective view taken. They are
defaulted to be unbound - like XMAX etc.) VIEWPT may be set to a
list of 3 numbers and gives the point from which the projection
should be made. CENTERPLOT may likewise to set to a list of 3
numbers and gives a point on the line of sight. The projection
will be made onto a plane perpendicular to a line joining VIEWPT
and CENTERPLOT.
If VIEWPT and CENTERPLOT are unbound (the default) then they will be
chosen as follows: the extreme values of the coordinates are
determined. This gives the two points min: [xmin,ymin,zmin],
max:[xmax,ymax,zmax]. CENTERPLOT is chosen as (min+max)/2 and
VIEWPT is chosen as max+3*(max-min). The view is then one in
which the z axis is vertical, the x axis is increasing towards
you to the left and the y axis is increasing towards you to the
right.
If CENTERPLOT is FALSE then the old type of perspective view will be
given (like setting the x and z components of CENTERPLOT to the
corresponding components of VIEWPT).
Before you set either VIEWPT or CENTERPLOT you might want to look at
the values of VIEWPT1 or CENTERPLOT1, the values that PLOT3D
assumed in doing the previous plot [see (Sec 8.4)]. Likewise
XMAX3D, YMIN3D etc. will be the values of xmax, ymin for the data
points, that PLOT3D used to determine the default VIEWPT or
CENTERPLOT.
If rather than changing the view you want to change the scale of the
plot (to cause clipping or whatever), then you must change XMAX,
XMIN, YMAX or YMIN (Sec 8.2). However note that these numbers
refer to the size of the plot AFTER the perspective routines have
been used. So again you will probably want to look at XMAX1 etc.
to find what had been assumed.
Read also about REPLOT (Sec 5.1). This allows you to rapidly explore
a 3D plot by doing for instance PLOT3D(...); VIEWPT : [...];
REPLOT(); VIEWPT : [...]; REPLOT(); etc.
Example
PLOT3D(EXP(-X^2-Y^2)*X, X, -2, 2, Y, -1.5, 2.5, DONT);
recreate easy example of (Sec 3.1). Use DONT (Sec 12.5) to
suppress plotting.
VIEWPT : [-2.1,3,.05]; take a "closer" look.
REPLOT();
KILL(VIEWPT);
3.5) CROSSHATCH and UNDERSIDE
As a default PLOT3D will crosshatch, i.e., plot lines of constant x as
well as constant y. You can turn this off by doing CROSSHATCH:
FALSE; (it will then plot only lines of constant y)
If UNDERSIDE is TRUE (the default) PLOT3D will show the underside of
a figure (when it is visible).
Example (continued from previous section)
CENTERPLOT:CROSSHATCH:FALSE;
REPLOT();
3.6) HIDE, \3D, CONTOUR and NOT3D
Internally the plots generated by PLOT3D (with or without the NOT3D
option), GRAPH3D and CONTOURPLOT2 (Sec 4.1) are the same and it
is possible to switch between any of the 4 representations.
The 4 representations are accessible directly in the following ways
(i) Hidden-Line PLOT3D, GRAPH3D(..., HIDE)
(ii) 3D (Hidden lines not removed) PLOT3D(..., \3D), GRAPH3D
(iii) Contourplot PLOT3D(..., CONTOUR), CONTOURPLOT2
(iv) Not3d PLOT3D(..., NOT3D)
(In the above GRAPH3D(..., HIDE) means supply GRAPH3D with an
optional argument of HIDE)
There are two ways of changing representations once the plot has been
made. In a ^A break, or using the REPLOT (Sec 5.1) function.
In a ^A break there are 2 variables which govern the representation
\3D and TXTYPE (Sec 13.1). (These variables are local to the ^A
break.) They should be reset according to the following table
value of \3D value of TXTYPE
Hidden-Line HIDE FALSE
3D TRUE FALSE
Contourplot CONTOUR FALSE
Not3d FALSE NOT3D
(Note that TXTYPE only need to be touched switching to and from
the Not3d representation. It is a misfeature that it should have
to be touched at all and this may be corrected someday.)
Having exited the plot, you can have it REPLOT'ed in another
representation by using the following table.
Hidden-Line REPLOT(TRUE, HIDE);
3D REPLOT(TRUE, 3D);
Contourplot REPLOT(TRUE, CONTOUR);
Not3d REPLOT(TRUE, NOT3D);
Again, as a misfeature when swapping from a Not3d representation
to a Contourplot it necessary to supply an additional optional
argument LIN (thus REPLOT(TRUE, CONTOUR, LIN);) The TRUEs in the
calls to replot indicate the last plot. The name of a named plot
(Sec 12) may be used instead (see (Sec 5.1) for details).
Example (continued from previous section)
REPLOT(TRUE,CONTOUR);
3.7) PLOTNUM0 and PLOTNUM1
If the <low>, <high> form is used with <var1-range> in PLOT3D, the
<y-var> takes on PLOTNUM1 values. PLOTNUM1 defaults to 20. Since
PLOTNUM*PLOTNUM1 points are normally calculated when PLOT3D is
called, the alternative form (Sec 3.1) for calling PLOT3D is
highly recommended.
Normally when the <low>, <high> form of <var-range> is used in PLOT3D
the <x-var> takes on PLOTNUM values. However if PLOTNUM0 is bound
to a numeric value, then PLOTNUM0 points are plotted instead.
PLOTNUM0 is initially unbound. For example, if you normally like
fairly high definition two-dimensional plots, but can't afford to
wait for comparable resolution three-dimensional plots, you could
set (PLOTNUM:100, PLOTNUM0:PLOTNUM1:20);
4) Contour plotting
1) CONTOURPLOT2
2) CONTOURS, ZMAX and ZMIN
3) LABELCONTOURS
4.1) CONTOURPLOT2
Easy examples
CONTOURS:10; Do 10 contours
LABELCONTOURS:FALSE; Don't label the contours
CONTOURPLOT2(Y^2/2+COS(X)+X/2, X, -6, 6, Y, -3, 3); Do a contour
plot of Y^2/2+cos(X) as X takes PLOTNUM values between -6 and
6 and as Y takes PLOTNUM1 values between -3 and 3. (This
gives you the phase space orbits of a particle in a periodic
potential superimposed on a constant field).
PLOT3D(Y^2/2+COS(X)+X/2, X, -6, 6, Y, -3, 3, CONTOUR); The same
CONTOURS:[0]; Plot only the zero contour.
CONTOURPLOT2([REALPART((X+%I*Y)^3-1), IMAGPART((X+%I*Y)^3-1)], X,
-1.5, 1.5, Y, -1.5, 1.5, [0,1]); Finds the zeroes of Z^3=-1
in the complex plane.
CONTOURS:PLOTNUM:PLOTNUM1:10; Work with a 10x10 grid
CONTOURPLOT2(RANDOM(100), X, 0, 1, Y, 0, 1); Plot something random
Complete description.
CONTOURPLOT2(...); is exactly the same as PLOT3D(..., CONTOUR). That
is it calculates the same points as PLOT3D(...) would, but
displays the points as a contour plot. What contours are drawn is
governed by the variable CONTOURS (Sec 4.2). Changing CONTOURS
does not require any more points to be calculated, so it makes
sense to change CONTOURS in the ^A break after a plot (Sec 2.6)
or before using REPLOT (Sec 5.1). The contours are drawn using
linear interpolation, so they tend to look rough (especially near
saddle points) unless PLOTNUM (or PLOTNUM0) and PLOTNUM1 are
large. The contour tracking algorithm is quite smart so all
contours should either terminate at the boundaries of the region
or be closed loops.
4.2) CONTOURS, ZMAX and ZMIN
If CONTOURS is a positive integer (the default value is 20), then
approximately CONTOURS contours will been drawn and the levels
will be "nice" values. ("Nice" means in multiples of a*10^n,
where "a" is 1, 2, or 5. The levels are computed by the same
function that determines where to put the tick marks on the axes
(Sec 7.2).) The contour levels are chosen between the maximum and
minimum z values to be plotted (the first argument to
CONTOURPLOT2 and PLOT3D is considered to be a z variable). If
either ZMAX or ZMIN has a value then that value will be used
instead of the actual maximum or minimum. (The default is for
ZMAX and ZMIN to be unbound; that's done by KILL(ZMAX, ZMIN);)
If CONTOURS is a negative integer then ABS(CONTOURS) evenly spaced
contours will be drawn. In this case the levels will be at
"nasty" values and you may want to set LABELCONTOURS to FALSE, to
suppress the printing of long numbers on the contours. Again the
range for these contours can be restricted by setting ZMAX and
ZMIN appropriately.
If CONTOURS is a list of numbers (e.g., CONTOURS:[1,.5,%PI];) then
those numbers will be used to determine the heights of the
contours. The number in the list can be in any order.
4.3) LABELCONTOURS
CONTOURPLOT2 will label the contours will their height unless
LABELCONTOURS is FALSE. PLOTNUMPREC (Sec 6.4) digits of precision
are given.
5) Other plotting functions
1) REPLOT
2) PLOTMODE
3) CLEAR
4) HARDCOPY
5) PLOTRESET
5.1) REPLOT
Easy examples
PLOT2(1, X, 0, 2*%PI); Plots a straight line
REPLOT(TRUE, POLAR); Plots it in polar coordinates (Sec 13.1). This
will appear as an ellipse unless EQUALSCALE:TRUE (Sec 8.3)
EQUALSCALE:TRUE;
REPLOT(); Replots the ellipse with EQUALSCALE equal to TRUE; this
will then appear as a circle.
Complete Description
REPLOT(<plotname>, <optional-args>); replots the plot named
<plotname> (Sec 12). REPLOT(TRUE); and REPLOT(); both replot the
last plot. If any of the options for determining the scale, etc.
have been changed since the plot was saved the new values of
those options will be used.
If the arrays of <plotname> were destroyed either by a
KILLPLOTS(<plotname>); (Sec 12.4) or by SAVE'ing <plotname> and
LOADFILE'ing it into another MACSYMA, REPLOT checks to see if
<plotname> was ever saved using the SAVEPLOTS command (Sec 12.2),
if it was it finds the <filespec> under which it was saved and
then attempts a LOADPLOTS(<filespec>); (Sec 12.3) (but taking
care not to change the current file defaults) and replots
<plotname> if it was found in the file.
<optional-args> may be any of the optional arguments to the main
plotting functions. These optional args will be merged in with
those supplied to the original plot. (The exceptions are FIRST,
LAST and SAME (Sec 10.2), TOP, BOTTOM, LEFT and RIGHT (Sec 10.4),
and DONT (Sec 12.5). These optional argument don't stick around
with the plot.) If you want the last plot replotted with some
optional args supplied you must use the form REPLOT(TRUE,
<optional-args>); (REPLOT(<optional-args>); won't work because it
will try and use the first optional arg as a <plotname>).
There are two additional optional arguments that it makes sense to
give to REPLOT, but not to the original plotting function. They
are NONE, to suppress a label (Sec 6.1) and LIN, to suppress a
transformation (Sec 13).
REPLOT(<list-of-plots>, <optional-args>); where <list-of-plots> is
[<plotname1>, <plotname2>, ... ] is identical to
(REPLOT(<plotname1>, <optional-args>), REPLOT(<plotname2>,
<optional-args>)); If the first arg to REPLOT is atomic then it
is evaluated and the evaluated form is used if is a list.
Example
REPLOT(PLOTS); Replots all named plots (Sec 12.6).
5.2) PLOTMODE
Easy example
PLOTMODE(DISPLAY, XGP); Set things up for plotting on the XGP and a
datapoint.
Complete description
PLOTMODE(<dev1>, <dev2>, ... ); sets PLOT2 up to plot on the devices
specified by <devi>. at present <devi> can be one of T (or TEK or
TEKTRONIX), I (or IMLAC), GR (or GRINNELL), D (or DISPLAY), P (or
PRINTING), X (or XGP), G (or GOULD), or V (or VERSY or VERSATEC)
for Tektronix, Imlac, a display console, printing terminal, the
XGP, the Gould in 38-246, or an MFE-NET Versatec. Any number of
arguments may be given with the restriction that no 2 of [I, T,
GR, D, P] appear together. The arguments may appear in any order,
with the first argument being used to determine what the
character size will be assumed. The defaults performed when PLOT2
is loaded is PLOTMODE(T), PLOTMODE(I), PLOTMODE(D) or
PLOTMODE(P), depending on the terminal type [see (Sec 15.3) for
details]
Details of the peculiarities of the various devices in given in (Sec
11).
PLOTMODE:<dev>; PLOTMODE:[<dev1>, <dev2>, ... ]; are equivalent to
PLOTMODE(<dev>) and PLOTMODE(<dev1>, <dev2>, ...); respectively.
This allows you the bind PLOTMODE (e.g., in a BLOCK).
PLOTMODE; returns a list of the devices PLOT2 currently is plotting
for. PLOTMODE(); also does this.
5.3) CLEAR
CLEAR(); clear the screen
5.4) HARDCOPY
HARDCOPY(); queues up the plot for the appropriate device if PLOTMODE
contains GOULD, XGP, or VERSATEC, else it sends out a hardcopy
signal to the Tektronix if PLOTMODE contains TEKTRONIX, else it
prints "HARDCOPY failed". This is what happens when you type a
linefeed at the end of a plot.
HARDCOPY(<plot-spec>); If <plot-spec> is a list, then it is assumed
that it is the name of a plot file as produced by NAMEFILE (Sec
11.5). If the current plotmode specifies a non-terminal device
(i.e., one of XGP, Gould, or Versatec), then the file is queued
for printing on that device. If <plot-spec> is not a list, then
it should be TRUE (for the last plot) or a named plot produced by
NAMEPLOT (Sec 12.1) or <rubout> at the end of the plot (Sec 2.5).
In this case REPLOT(<plot-spec>); HARDCOPY(); is done
HARDCOPY(<plot-spec>, <plotmode>); where <plotmode> is one of XGP,
GOULD, or VERSATEC, or one of the abbreviations of these, is
equivalent to BLOCK([PLOTMODE:<plotmode>],HARDCOPY(<plot-spec>));
If the variable HARDCOPY (default FALSE) is TRUE, then a HARDCOPY();
is done after each plot (as long as WAIT is also TRUE). In this
case a linefeed does nothing. HARDCOPY is not reset by
PLOTRESET();. This switch allows PLOT2 to run in "batch" mode.
Put your program in a BATCH file and preface it with for
instance: (PLOTMODE:'XGP, TTYOFF:HARDCOPY:TRUE); Then once the
batch has started up, you can do ^Z, :PROCEED, :DISOWN. This
isn't necessarily the best way of operating because your plots
may well get lost in the mess around the XGP. If this is a
problem then use NAMEFILE after each plot and queue them to be
printed at a more convenient time.
5.5) PLOTRESET
PLOTRESET(); resets most of the options effecting plotting back to
their default values. The exceptions are the terminal related
options. See (Sec 15.1) for details.
6) Labels
1) XLABEL, YLABEL, TITLE and NONE
2) LABEL
3) NOPRINT
4) PLOTNUMPREC
5) DATEPLOT
6.1) XLABEL, YLABEL, TITLE and NONE
Easy example
PLOT2(EXP(X), X, 0, 3, X, EXP(X), "THIS IS A PLOT OF EXP(X) VS. X");
plots a curve of exp(X) with an x-label of "X", a y-label of
"EXP(X)" and a title of "THIS IS A PLOT OF EXP(X) VS. X" (the
labels don't appear with the "'s)
A:3;
PLOT2(SIN(X)+A, X, -%PI, %PI, FALSE, FALSE, LABEL(A)); plots
sin(X)+A and sticks an the title "A=3".
PLOT2(SIN(X), X, -%PI, %PI, FALSE, SIN(X)); labels the y-axis with
"SIN(X)".
Complete description
<xlabel>, <ylabel>, <title> If the optional arguments to the plotting
functions aren't any of the recognized keywords (FIRST, LAST
etc.) they are taken to be specifications for the x-label,
y-label and the title of the plot. If it is (a) an atom, (b) of
the form 'FOO or '(...), (c) of the form EV(...) or CONCAT(...)
or LABEL(...) (Sec 6.2), then the label gets evaluated, else it
is used literally. [Note that the evaluation of 'FOO is FOO for
all FOO, so if you want to get a label of FOO and FOO has a value
use 'FOO. ("FOO" also works in most instances.)]
If one of them is FALSE then nothing gets printed. Only as many of
the three to be non-ambiguous need be specified; thus if only a
y-label is required then FALSE, <ylabel> would be sufficient.
None of these options may be a list (to avoid confusion with the
line-type list (Sec 9.1).
Within a ^A break at the end of a plot (Sec 2.6), the x-label,
y-label and title of the current plot are the values of the local
variable XLABEL, YLABEL and TITLE. These variable will be FALSE
if there is no corresponding label. You can change the values of
these variables in the ^A break and they will be incorporated into
your plot when you exit the break and type a tab (Sec 2.3).
In the optional arguments to REPLOT (Sec 5.1) FALSE has the meaning
"Don't change the corresponding label". If it is desired to
remove a label when REPLOTting then NONE should be given instead.
Examples
PLOT2(SIN(X), X, -%PI, %PI, FALSE, FALSE, "THE CAT SAT ON THE MAT");
title is set to "THE CAT SAT ON THE MAT"
REPLOT(TRUE, "X-AXIS");
title is "THE CAT SAT ON THE MAT" and x label is "X-AXIS"
REPLOT(TRUE, FALSE, "SIN(X)", NONE);
x label is "X-AXIS", y label "SIN(X)" and no title
REPLOT(TRUE, FALSE, "Y-AXIS"); replots with new ylabel.
6.2) LABEL
This is a special form of CONCAT for use with PLOT2. It takes any
number of arguments and returns an atom containing the arguments
concatenated together. It differs from CONCAT in the following
respects:
(i) It sticks spaces between the items.
(ii) The arguments needn't be atoms.
(iii) If an argument is of the form 'FOO, then FOO appears in the
result.
(iv) Otherwise it evaluates the arguments. Then if the evaluation
is different from the argument <arg>=<evaluation> appears in
the result, else just <evaluation>.
(v) In (iv) if <evaluation> is a floating point number then only
PLOTNUMPREC (Sec 6.3) sig. figs. of it appear in the answer.
The label is evaluated inside an ERRCATCH, so if you have an
error in the evaluation of your label, you will see an error
message, but the plot will still come out (with no label where
you goofed).
Example
PHASE:EV(%PI, NUMER);
AMPLITUDE:2;
PLOTNUMPREC:5;
PLOT2(AMPLITUDE*SIN(X-PHASE), X, 0, 2*%PI, LABEL(AMPLITUDE, PHASE));
produces a plot with an XLABEL of "AMPLITUDE=2 PHASE=3.1416"
6.3) NOPRINT
As a default the 2D plotting functions include a line at the bottom
with the Max and Min of X and Y printed. NOPRINT:TRUE; causes
this line to be suppressed.
6.4) PLOTNUMPREC
The numbers that PLOT2 prints out in the Min and Max line at the
bottom of the plot (Sec 6.3), in the Min and Max labels on the
axes (Sec 7.1), in LABEL (Sec 6.2) and on the contours (Sec 4.3)
are given to a precision of PLOTNUMPREC significant figures.
(This is done using JONL's FFORMAT package on LIBLSP;) A trailing
".0" is stripped off so that "2" is printed instead of "2.0". The
default is to give the numbers to full precision. If you want to
have less precision given (particularly useful with the labelling
of contour levels) set PLOTNUMPREC to a smaller number (say 2 or
3).
6.5) DATEPLOT
The date is normally given at the top right corner of the plot, in a
long form if no title is specified, or in a shorter form if a
title is specified. Sometimes the date overlaps with the title.
You can shut off the printing of the date by doing
DATEPLOT:FALSE;
7) Axes
1) XAXIS and YAXIS
2) TICKSIZE and TICKNUM
7.1) XAXIS and YAXIS
The default action of PLOT2 for 2D plots is to provide the plots with
x and y axes (which go through the origin if the origin is within
the plot) to give the axes approximately 10 tickmarks in
reasonable places to give the max and min values of x and y by
the axes and on a line beneath the plot.
XAXIS:FALSE; YAXIS:FALSE; cause the x axis and y axis not to be
drawn. Their tickmarks will not be drawn either. The other values
these options can take are:
TRUE draw the axis and the tick marks;
ALL (the default) draw the axis, the tick marks and give the max
and min values of this coordinate.
7.2) TICKSIZE and TICKNUM
TICKNUM:<no-of-ticks>; TICKSIZE:<size-of-ticks>; causes TICKNUM ticks
to be given on each axis. The size of the ticks will be TICKSIZE
raster units either side of the axes. The ticks will always come
at "nice" values of the x or y variable. "Nice" values are
defined to be multiples of <k>*10^<n> where and <n> are integers
and <k> is 1, 2 or 5.
TICKSIZE:0; results in there being no ticks and
TICKSIZE:2000; results in the ticks going all the way across the
WINDOW (Sec 8.1), causing the ticks to turn into grids.
Setting TICKNUM to a negative number causes about abs(TICKNUM) ticks
to be drawn, but PLOT2 won't round the max and min values on your
axes to the nearest tickmark.
Both TICKSIZE and TICKNUM may be lists of two numbers the first
referring to the ticks on the xaxis and the second to the ticks
on the y axis.
Example
TICKNUM:10; (the default)
PLOT2(X, X, 5, 25); gives scales from 4 to 26 on the x and y axes
TICKNUM:[-10,5]; the -10 refers to the x axis and 5 to the y axis
TICKSIZE:[6,2000];
REPLOT(); (Sec 5.1) replots the last plot with grid line every
multiple of 5 up the y axis, and tickmarks every multiple of 2
along the x axis. Both scales go from 5 to 25.
As yet no axes are provided for 3D plots. Suggestions for their
implementation are welcome.
8) Scales
1) WINDOW
2) XMIN, XMAX, YMIN and YMAX
3) EQUALSCALE
4) WINDOW1, XMIN1 etc.
If the user takes no action the scale of his plots will be chosen for
him. in general the scale will be as large as possible, while still
allowing everything to fit on the screen. the user is provided with
various ways of overriding the default settings for the scales:
8.1) WINDOW
WINDOW:[<min-x>, <max-x>, <min-y>, <max-y>]; This sets the area of
the screen that PLOT2 tries to plot in. The elements of the list
are in raster units. The maximum permissible size of the WINDOW
is [0,1023,0,1023]; garbage will be produced if the WINDOW is
larger than this. If PLOT2 tries to plot outside the window, the
plot will be clipped correctly. If WINDOW is unbound then the
default settings will be used (corresponding to the full
tektronix screen), thus you can get back the default value be
doing KILL(WINDOW);
8.2) XMIN, XMAX, YMIN and YMAX
In choosing the scale for a plot PLOT2 looks at the maximum and
minimum values of x and y of the points it has calculated.
However if one of XMIN, XMAX, YMIN, YMAX has a numeric value then
that value will be used instead of the one found from the points
themselves. As with WINDOW do KILL(XMIN, etc) to get back to the
default values. The maximum and minimum values of x and y that
PLOT2 obtains are rounded up and down to the nearest tick mark,
unless TICKNUM is negative (Sec 7.2).
8.3) EQUALSCALE
EQUALSCALE:TRUE; tells PLOT2 to ensure that the scales are the same
in both directions. Thus if the WINDOW is rectangular, a circle
will normally appear as an ellipse, whereas with EQUALSCALE:TRUE
it will appear as a circle.
8.4) WINDOW1, XMIN1 etc.
All the plotting options whose default state is unbound (e.g., XMAX,
WINDOW) have corresponding options obtained by sticking a "1" on
the end (e.g., XMAX1, WINDOW1). These options should only be read
(not set), and their values may be loosely defined to be the
value that PLOT2 assumed for the option. The value will only be
right if PLOT2 needed to calculate it.
Example
PLOT2(X, X, 0, 10.1); YMAX; ==> YMAX
YMAX1; ==> 11.0 (the max value of y on the y axis)
Variables in this class are:
XMAX1, XMIN1, YMAX1, YMIN1. These refer to the quantities after
the transformation functions (Sec 13) have been applied, and
after rounding to the nearest tickmark.
ZMAX1, ZMIN1. Only of use for contour plots (sec 4). Equal to
ZMAX and ZMIN if they have values. Equal to the max and min
values of the first argument to CONTOURPLOT2, if ZMAX and
ZMIN are unbound. There values are meaningless if CONTOURS is
a list, since then CONTOURPLOT2 doesn't need to compute zmax
and zmin.
WINDOW1. The window in which plotting is done. Does not include
the room used by titles etc.
XMAX3D, XMIN3D, YMAX3D, YMIN3D, ZMAX3D, ZMIN3D. Only of use for
3D plots (Sec 3). These are the values of the 3D data before
transforming it to 2d. This will only be up to date
information if PLOT3D needed to calculate it to determined
either the default VIEWPT or the default CENTERPLOT.)
VIEWPT1, CENTERPLOT1. Only of use with 3d plots. Useful to look
at before you change VIEWPT or CENTERPLOT.
These variables are especially important when changing the scale of
3D plots (Sec 3), because YMAX etc. refer to the values after the
perspective transformations, and so may be quite unrelated to the
data points.
Example
PLOTNUM:PLOTNUM1:20;
PLOT3D(1/(X^2+Y^2), X, -3, 3, Y, -3, 3); Has a big peak in the
middle which we wish to clip
YMAX1; ==> -0.896...
YMIN1; ==> -0.957...
YMAX:-0.92; Try a value of YMAX about 1/2 way between the old YMAX
and YMIN
REPLOT(); Replot on new scale.
9) Line types
1) TYPEL
2) DEFINEDASH
3) DEFINESYMBOL
9.1) TYPEL
Easy examples
PLOT2([SIN(X), COS(X)], X, -%PI, %PI, [0,1]); Plots sin(X) with line
type 0 (a solid line) and cos(X) with line type 1 (a dashed
line)
PARAMPLOT2(RANDOM(), RANDOM(), X, 0, 1, [19]); Plots PLOTNUM
"random" points with symbol 1 (no connecting lines drawn)
TT:[0,1,2,3,4,5,6,7,8];
PLOTNUM1:9;
PLOT3D(SIN(X)+A, X, -%PI, %PI, A, 0, 2, TT, NOT3D); Gives the full
repertory of line types
TT:9+10*(TT+1); TT is now [19,29,39 ... ]
REPLOT(TRUE, TT); Gives the full repertory of symbol types.
Complete description
If a list (or an atom that evaluates to a list) appears as an
optional argument to a plotting function, then that list is taken
as a specification of the line type to be used for the plot. The
elements of the list are evaluated once and the elements of the
resultant list must be all integers. If this list has the form
[<type1>, <type2>, ..., <typei>, ..., <typek>]
then the i'th curve is to be plotted with line of type <typei>.
The (k+1)th curve is plotted with line of type <type1> etc.
Omitting this optional argument is the same as specifying [0],
i.e., all the curves are plotted with line of type 0 (i.e., solid
line with no symbols).
The curves drawn by the PLOT2 functions may be drawn as 1 of 9 types
of dashed line, with 1 of 9 types of symbol drawn at the data
points. In general the line type <typei> is of the form of a
decimal number abbcd where a b c and d are digits between 0 and 9
(leading 0's may be omitted of course) and have the following
meanings:
d = line-type. (specified by the DEFINEDASH (Sec 9.2) command)
Line-type 0 (the default) is defined as being a solid line
Line-type of 9 defaults to meaning no line
c = symbol-type. The symbol is defined by the DEFINESYMBOL (Sec
9.3) command Symbol 0 is defined to mean no symbol Symbol 9
is defined to mean a dot.
bb = number of data points with no symbol between the data points
with a symbol. If bb = 99 then bb is set to PLOTNUM-1. If bb
= 98 then bb is set to PLOTNUM-2. (PLOTNUM is taken here to
mean the number of point in the plot.)
a. the first symbol is put at data point number 1 if a = 0 and
at bb+2-a otherwise.
Examples
abbcd = 0 ==> plain line
10 ==> symbol 1 at every pt + plain line
19 ==> symbol 1 at every pt
99 ==> a dot at every point
124 ==> symbol 2 at every other pt + line 4
9874 ==> line 4 with symbol 7 at endpoints
9974 ==> " " " " at first point
19974 ==> " " " " at last point
PLOT3D(2*X^2+A, X, -0.95, 0.95, A, 0, 7, INTEGER, NOT3D,
[0,10,19,99,124,9874,9974,19974]); Try them out
9.2) DEFINEDASH
DEFINEDASH(<line-no>, <line-spec>); redefines line number <line-no>
according to <line-spec>. <line-spec> may be one of the
following:
FALSE then the line is defined to be a solid line.
TRUE then no line is drawn (useful in conjunction with a symbol).
A list which defines a sequence of line segments separated by
gaps. Example: DEFINEDASH(3, [1,5,5,5]); defines line 3 to
start with 1 raster position on, 5 off, 5 on, 5 off, 1 on, 5
off etc.
A character (e.g., A, "1", \$) or its ASCII value. This defines
the character to be used for line <line-no> when plotting on
printing or display consoles, see (Sec 11.4). In order to
specify no line give 0 as the second argument (not space or
32, as this will cause existing lines, axes etc, to get
over-written and, maybe erased, by spaces).
<line-no> must lie between 0 and 9.
Note that dashed lines are implemented by drawing a sequence of small
undashed lines. Since these lines are about 4 - 10 raster units long,
there are only a small number of directions in which they can point
and the chances are that none of these directions coincide with the
direction of the dashed line as a whole. Hence dashed lines often
appear to weave about.
9.3) DEFINESYMBOL
DEFINESYMBOL(<symbol-no>, <symbol-spec>); redefines symbol number
<symbol-no> according to <symbol-spec>. <symbol-spec> may one of
the following:
FALSE meaning no symbol
TRUE meaning a point
A list of lists given a sequence of setpoint and vector commands
(relative to starting position) to be used in drawing the
symbol. Example:
DEFINESYMBOL(3, [[5,5], [5,-5,-5,-5,-5,5,5,5], [0,0],
[0,0]]); This defines symbol 3 to be drawn by a setpoint to
5,5 (relative to the starting position) following by vectors
to 5,-5; -5,-5; - 5,5; 5,5, followed by setpoint to origin
and a vector to origin. this will draw a box with a dot in
it. The numbers are in raster positions. DEFINESYMBOL should
always end with a setpoint or vector to [0,0].
A character or its ASCII value. This is interpreted the same way
as for DEFINEDASH.
Example
DEFINESYMBOL(1, [[0,9], [4,-6,-7,2,7,2,-4,-6,0,9], [0,0]]);
This defines symbol 1 to be a 5 pointed star.
PLOT2(1,X,0,2*%PI,POLAR,[19]);
10) Plotting several curves
1) CLEAR and WAIT
2) FIRST, LAST and SAME
3) REPLOT4
4) TOP, BOTTOM, LEFT and RIGHT
10.1) CLEAR and WAIT
By governing when PLOT2 clears the screen it is possible to either
superimpose plots or have plots come out in different parts of
the screen.
CLEAR:FALSE; causes the screen not to get cleared before starting a
new plot.
WAIT:FALSE; causes PLOT2 not to wait for a character to be typed
after finishing a plot.
Example
(CLEAR:TRUE, WAIT:FALSE, turn on clearing, turn off waiting
PLOT2(..), the screen will be cleared
CLEAR:FALSE, turn off screen clearing
PLOT2(..), plot more stuff
GRAPH2(..), etc.,
WAIT:TRUE, turn waiting back on
PLOT2(..), last plot
CLEAR:TRUE); reset CLEAR
Much more convenient ways are provided for doing this. See (Sec 10.2)
and (Sec 10.3)
10.2) FIRST, LAST and SAME
All these three are possible optional args to the plotting functions
and to REPLOT. These optional arguments are non-sticky; the fact
that they were supplied is not remembered by REPLOT, although you
can supply them to REPLOT.
FIRST or LAST. This says that this plot is to be the first (or last)
of a series of plots that are to be superimposed or plotted in
different parts of the screen. They work by setting the WAIT and
CLEAR flags (Sec 10.1) to achieve the right effect. (FIRST sets
CLEAR to TRUE and WAIT to FALSE before plotting and CLEAR to
FALSE after plotting. LAST sets WAIT to TRUE before plotting and
CLEAR to TRUE after plotting.
Example
In order to get 4 plots out in different corners of the screen a
typical sequence might be:
(WINDOW:<window1>, PLOT2(..., FIRST),
WINDOW:<window2>, PARAMPLOT2(...),
WINDOW:<window3>, REPLOT(...),
WINDOW:<window4>, GRAPH2(..., LAST),
KILL(WINDOW));
Obviously it is necessary to use a compound statement to prevent the
printing of unwanted cruft on the screen. Since plotting 4 graphs
together is quite common, the REPLOT4 (Sec 10.3) command is provided to
do that automatically.
SAME. This tells PLOT2 to plot this plot on the same scale as the
previous plot and in the same WINDOW (Sec 8.1). Plotting of axes
and printing of the date and the line giving XMAX etc is
suppressed. The intention is to allow the convenient
superposition of plots. Specification of a title and labels is
allowed, but if the previous plot which defines the scale of this
plot didn't have them they may appear in the wrong place (having
wrapped around the screen). if you want to specify a title, then
you should probably specify a null title "" in the original plot.
Example
In order to superimpose plots the normal sequence is:
(PLOT2(..., FIRST),
PLOT2(..., SAME),
PLOT2(..., SAME),
...
PLOT2(..., SAME, LAST));
PLOTNUM:40;
PLOT2(1, T, 0, 2*%PI, FALSE, FALSE, "", POLAR); Plot a circle.
Note the null title [see (Sec 13.1) for how POLAR works]
EQUALSCALE:TRUE;
NAMEPLOT(TEMPLATE); Name the circle TEMPLATE (Sec 12.1)
FOR PLOTNUM FROM 4 THRU 10 Bind PLOTNUM
DO (REPLOT(TEMPLATE, FIRST), Replot the circle (Sec 5.1)
PLOT2(1, T, 0, 2*%PI, FALSE, FALSE, CONCAT("N = ", PLOTNUM-1),
POLAR, SAME, LAST) );
Plot a polygon with PLOTNUM-1 faces inscribed in the circle
and with a title computed with CONCAT (Sec 6.1).
10.3) REPLOT4
REPLOT4(<plot1>, ..., <plotk>); conveniently replots up to 4 plots in
different parts of the screen. <plot1> etc must be named plots
(Sec 12). It plots the first plot in the upper left hand corner
of the default window (or of your own window, if WINDOW (Sec 8.1)
has a value), the second arg in the upper right hand corner etc.
It stops when it runs out of things to plot. This function takes
care of the business of specifying the FIRST and LAST options to
REPLOT, so dont give them to REPLOT4. REPLOT4 only puts the date
on the top right plot (assuming DATEPLOT:TRUE;). The exception is
if you only ask REPLOT4 to plot only 1 plot (by giving it 1
argument) in which case the date goes on that plot.
Example
PLOT2(X, X, 0, 1); plots X vs X
NAMEPLOT(A1); names it A1
PLOT2(SIN(X), X, 0, 2*%PI); etc.
NAMEPLOT(B[1]);
PLOT2(X^2, X, 0, 1);
NAMEPLOT(FOO);
REPLOT4(A1, B[1], FOO); replots A1, B[1] and FOO
10.4) TOP, BOTTOM, LEFT and RIGHT
These govern where in your plotting window the plot will actually
appear. e.g., TOP and LEFT mean put the plot in the top left
corner, BOTTOM means in the bottom half of the window, RIGHT in
the right half, etc. Non-contradictory flags can appear together.
These flags are non-sticky, meaning that REPLOT doesn't remember
them, although it recognizes them. The gap left between the plots
you get using these flags is PLOTGAP screen coordinates (default
value 20).
Example
(PLOT2(X, X, 0, 1, TOP, FIRST), PLOT2(1-X, X, 0, 1, BOTTOM, LAST));
PLOT2(SIN(X), X, -%PI, %PI, DONT);
REPLOT(TRUE, TOP, LEFT); Replots in top left corner.
REPLOT(); Replots in the whole window.
REPLOT4 with 4 arguments could be defined by:
REPLOT4(PL1,PL2,PL3,PL4) := BLOCK([DATEPLOT:FALSE, DP:DATEPLOT,
PLOTGAP:20],
REPLOT(PL1, TOP, LEFT, FIRST),
BLOCK([DATEPLOT:DP],
REPLOT(PL2, TOP, RIGHT)),
REPLOT(PL3, BOTTOM, LEFT),
REPLOT(PL4, BOTTOM, RIGHT, LAST));
Note the flag SAME means to keep the same window as well as the same
scale. Thus SAME overrides TOP, BOTTOM, etc. If you want to preserve
the scale, the thing to do is to do all the plots but the first
inside a BLOCK([YMAX:YMAX1, YMIN:YMIN1, XMAX:XMAX1, XMIN:XMIN1], ...)
(Sec 8.2) (Sec 8.4).
11) Device characteristics
1) Tektronix
2) Imlac
3) Grinnell
4) Printing and Display
5) XGP
6) Gould
7) Versatec
A number of different devices are supported by PLOT2. You set things
up for a particular device using the PLOTMODE command (Sec 5.2). Each
has its peculiarities, which will be described here.
Note that if you plotting on a terminal you should only interrupt a
plot by doing ^G, because your terminal will be left in a screwy
state otherwise (Sec 2.8).
11.1) Tektronix
The Tektronix has problems keeping up with PLOT2 at 9600 baud (the
speed at which the one in 38-246 runs) if short vectors are used.
For that reason PLOT2 will not normally use short vectors if your
speed is greater than 2400 baud. This is governed by the variable
PADDED (default value IS(SPEED>2400)). If the vectors are coming
out smeared try setting PADDED:TRUE;. (PADDED is recomputed on
each call to PLOTMODE; so you should do PLOTMODE(); after
changing speeds.)
The other function for which padding is important on the Tektronix is
screen clearing. (You can't plot for 1 second afterwards.) The
padding is sent out by ITS in this case and it determines the
amount of padding from your speed. You should therefore ensure
that ITS knows what your speed is. (You can check it by doing
:TCTYP DESC (in DDT), and set it by e.g., :TCTYP SPEED 1200 .)
For Tektronix's with graphic cross-hairs the EDIT function (Sec 14)
can be used to edit plots. (Put the labels in the right place
etc.)
PLOT2 also supports other than the standard Tektronix terminals
(4010, 4013, etc.). Plotting is also possible on the Tektronix
4025 and 4662.
For the Tektronix 4025 set PLOTMODE:'TEK; TEK4025:TRUE; and then
PLOT2( ... ) or whatever. The Tektronix 4025 is supported by
:CRTSTY TK4025. The terminal has to be told to expect the regular
Tektronix graphics that is used by the Tektronix 4010 terminal.
[How this is done is described by KAT. In the 4025 the screen is
split into two regions, the work space and the monitor. The monitor
is the space that communicates with the host unless the host is
transmitting graphics, in which case the graphics goes to the work
space. The user has to specify the size of the work space (which
specifies the size of the monitor by giving it whats left) and
defining the a graphics region in the work space. To have the 4025
accept 4010 graphics an additional command is needed, the shrink
command. So to get the 4025 to do 4010 graphics the following TEK
commands are needed (` is the command character that CRTSTY uses to
communicate with the terminal): "`wor n <cr>" set the size of the
workspace to n. I use n=20 which leaves 13 lines for the monitor.
"`graphic 1,35 <cr>" makes the graphic region occupy the first 35
lines of the workspace, the args to graphic can define the graphics
to be anywhere in the workspace as long as it defines 35 lines
because that is the size of the 4010 graphics region; i.e., graphic
35,69 would be fine. It's OK that the graphic region is defined to be
larger than the workspace, since the picture can be scrolled into
view; the wor command just defines the size of the visible portion of
the workspace. "`shrink <cr>" tells the 4025 to behave like the 4010.
I think that the above three commands are best done by the users
because (1) the `wor command also has the effect of erasing the
workspace and the monitor which might not be desired. (2) the size of
the monitor depends on whether the user needs to see a lot of the
host interaction or is just executing plots.]
Tektronix 4662s are supported by doing PLOTMODE:'TEK; TEK4662:TRUE;
11.2) Imlac
Ards graphics conventions are used. Only Imlacs supporting these
conventions are recognized by PLOT2. Imlacs do not have infinite
room for storing vectors, thus some plots (especially 3D and
Contour plots) won't fit. It may be necessary to locally clear
the screen (with the CLEAR button) during a plot. If you are also
plotting for the Gould or the XGP output to those devices will
not be effected.
11.3) Grinnell TV's (These are 512x512 TV terminal in Building 38)
Ards graphics conventions are used, however the coordinates are
divided by 2 before being plotted, so WINDOW etc. should be
chosen as though the screen coordinates ran from 0 to 1023 each
way.
11.4) Printing and Display
These are really only intended to give a preview of the plot before
it comes out on a higher resolution device like the XGP or the
Gould. Internally PLOT2 keeps a resolution appropriate for the
standard graphics devices (about 1000 x 1000), so that good
Hardcopies can be obtained. Instead of attempting to draw dotted
lines or symbols for the various line types (Sec 9) different
characters are used, although dotted lines and symbols will be
drawn on the Hardcopy device. Line type 0 is drawn with .'s. The
other line types (1 - 9) are drawn with other symbols (*, #, $
etc.). The symbols (specified by the tens digit of the line type)
are defined by the letters (A, B, C etc.). Unfortunately if you
choose a line type that specifies both a line and a symbol, the
line will in most cases overprint and so erase the symbol.
When plotting on another device, say the XGP, you might find that
PLOTMODE:[X,D]; (Sec 5.2), results in your seeing only a corner
of the plot. This is because it is assuming the XGP's character
size. You can correct this by doing PLOTMODE:[D,X]; since this
will use the terminal's character size. The copies you get out of
the XGP will have the characters slightly widely placed, but will
otherwise be OK.
The difference between how PLOT2 handles Printing and Display
terminals, is that with Display terminals PLOT2 knows that it can
move the cursor around and so it will plot your graph in the same
order that it would on say a Tektronix. With a Printing terminal,
it stores up the entire plot and spits it out at the end in a
line by line fashion. Multiple plots (Sec 10) are handled
correctly, the entire plot coming out only after the LAST call to
a plotting function.
The plotting is done on a character grid that is PLOTHEIGHT high and
LINEL wide. You may change these if you want, but the changes
must be followed by a call to the PLOTMODE function (PLOTMODE();
will do) to re-initialize things. With PLOTMODE(D) you will
probably lose badly if PLOTHEIGHT or LINEL is set larger than
your terminal can handle. Note that you can restrict the area of
the screen used, with more flexibility, by changing WINDOW (Sec
8.1). Don't forget that you can look at WINDOW1 to see what the
default was.
You might want to change the value of CHARRATIO (default value 2.5).
This should equal the ratio of line-pitch to the character-pitch
for your terminal. (This enables the EQUALSCALE:TRUE (Sec 8.3)
mode to work and ensures that what you see on your screen/paper
is the same shape as what will come out on the XGP.)
11.5) XGP
Plotting on the XGP works by writing a file of ARDS graphics commands
in a file on the .TEMP.; directory. The filenames are .PLOT.
<uname>. Since the XGP won't accept ARDS graphics commands, this
file must be processed into a SCN file by the Gould spooler. This
is done whenever HARDCOPY(); (Sec 5.4) is called or if you type
linefeed at the end of a plot (Sec 2.4). If AI is up and the
queuing for the XGP is successful, you will receive a message
from the XGP spooler when your plot is printed. If AI is down,
your plot will be processed into an XGP scan file, .GLPR.; > SCN,
and the Gould spooler will send you a warning message telling you
that AI is down. You must copy the SCN file to AI:.GLPR.;
yourself when AI comes up and queue it by doing in DDT
:XGP ;SCAN AI:.GLPR.;* SCN
The parameters PLOTSCALE (default value 1.0) and PLOTTHICK (default
value 2) govern the scale of the Gould output (the larger
PLOTSCALE the larger the copy) and the thickness of the lines.
PLOTTHICK must be an integer. The default PLOTSCALE and WINDOW
(Sec 8.1) produce a plot which nicely fits into an 8.5 x 11 piece
of paper. (Actually, PLOTSCALE gets multiplied by 1.75 to
determine the correspondence of screen coordinates and Gould
pixels.)
There are two additional parameters PLOTLFTMAR (default value 150)
and PLOTBOTMAR (default value 150) which govern the left margin
and bottom margin for plots output to the XGP. Both of these
parameters must be integers and the default values cause a plot
to fit on an 8.5 x 11 piece of paper.
Since the XGP has slightly different nominal resolutions across and
along the page (200/inch vs. 192/inch), EQUALSCALE produces plots
that are somewhat misshapen on the XGP. The Gould and Versatec
devices don't suffer from this defect.
NAMEFILE(<filespec>) takes the scratch file that PLOT2 uses in
PLOTMODE(GOULD); or PLOTMODE(XGP); and copies it to <filespec>.
The advantage of this is that the scratch file (which contains ARDS
graphics commands) is usually much shorter than the corresponding
SCN file, thus if you want to generate several plots for the XGP,
but aren't able to actually get them out on the XGP for a while
then use NAMEPLOT now and queue them to be printed by
HARDCOPY([<filespec>], XGP) (Sec 5.4). Or else, you can print the
plot file later by doing in DDT
:GLP <filespec>/A/O[X]
where <filespec> is an ITS-style filespec (i.e., dir;fn1 fn2).
Incidently since the file produced by NAMEFILE is ARDS graphics
commands the plot it contains can be viewed by :IMPRNT'ing the
file on an Imlac.
11.6) Gould
The method of producing a plot on the Gould is the same as for the
XGP except that PLOTMODE:[GOULD, ...] is specified. The options
PLOTSCALE etc. have the same effect. If you want to queue a file
that you have created with the NAMEFILE command to the Gould
either use HARDCOPY([<filespec>], GOULD) or :GLP <filespec>/A in
DDT.
Hardcopy can be produced off the Gould either by typing <linefeed>
after the plot has finished (Sec 2.4) or by executing HARDCOPY();
(Sec 5.4).
Note: Often people forget to say e.g., PLOTMODE(G, T); before doing a
plot. The thing to do in that case is: HARDCOPY(TRUE, GOULD);
(Sec 5.4). This will only work if your plot consisted of a single
call to a plotting function (the normal case).
11.7) Versatec
This enables you to generate scan files for 100/inch Versatec
printer/plotters which exist at various sites on the MFE-NET. As
far as PLOT2 goes, the Versatec is like the Gould. When a
HARDCOPY is requested, the Gould spooler generates a scan file
.GLPR.;> VER . These VER files can then be FTP'ed to your local
computer and renamed as PLT files (by RENAME *.PLT=*.VER) which
can then be printed on the Versatec with the PRINT *.PLT command.
[The PLT files consist of a sequence of 8-bit bytes packed in the
high 32 bits of each word. The first byte is 016 (octal) (this
specifies the format for the PPL Versatec). Thereafter the format is
as described by R. H. Frobose, Compression of Graphic Data in Raster
Format, Livermore report UCRL-51858 (June 1975).]
11.8) Dover
Plotting on the Dover is not fully supported yet. However there are
functions for directing the temporary file of ARDS vector
commands to the Dover. To get this file created use
PLOTMODE:'XGP; (or GOULD or VERSATEC or [XGP,GRINNELL] etc). The
command DOVARD_FILE(); takes the ARDS file produced by PLOT2, and
creates a PRESS file suitable for output to the DOVER. The
command DOVER_FILE(); will queue the file. For example, after you
have done PLOTMODE:'[G,GR], and PLOT2(X,X,0,1); you can then do
(DOVARD_FILE(),DOVER_FILE()); to queue the plot.
In the near future the HARDCOPY and PLOTMODE commands may be extended
to include this option, calling the functions in question for
you.
The Dover produces higher quality output than most other hard copy
devices and using it in this way is less of a drain on the system
than getting hardcopys on the XGP or Gould. However, the Dover
has a higher chance of jamming, and complicated 3d-plots may bomb
out. Also DOVARD_FILE() and DOVER_FILE() both go into DDT to do
their jobs. This means that your MACSYMA will need to TTY to
execute these functions.
12) Naming and saving of plots
1) NAMEPLOT
2) SAVEPLOTS
3) LOADPLOTS
4) KILLPLOTS
5) DONT
6) PLOTS
Plots can be given names, saved in files, killed just like other
MACSYMA data types. However since plots aren't really something
MACSYMA knows about there are a number of commands specifically for
manipulating plots.
12.1) NAMEPLOT
NAMEPLOT(<plotname>); names the last call to one of the plotting
functions <plotname>. <plotname> must be either an atom (e.g.,
FOOP) or an array element (e.g., SNOO[4]). <plotname> is stuck
onto the list PLOTS (Sec 12.6) so it becomes for instance
[<plotname>]. If <plotname> is an atom, then the plot is made
into the PLOT property of <plotname> (so it appears also in the
PROPS list). If <plotname> is an array element then the plot is
the value of that array element, so <plotname> gets put on the
ARRAYS list. (Don't try manipulating this value, because most of
Macsyma doesn't understand what a plot is. Thus
NAMEPLOT(SNOO[4]); BAR:SNOO[4]; REPLOT(BAR); won't work.) Typing
rubout at the end of a plot causes a <plotname> to get read in
and NAMEPLOT applied to it (Sec 2.5).
The argument to plotname is not evaluated. Thus you can say
NAMEPLOT(FOOP) without having to worry whether FOOP has a value
or not. However if the argument is an array element the
subscripts are evaluated. Thus if you have a program which plots
several plots (for instance with different values of some
parameter) you may want to use the array element form. Thus FOR
I THRU 3 DO (PLOT2(F(X,I), X, 0, 1), NAMEPLOT(PLT[I])); produces
plots PLT[1], PLT[2], PLT[3].
What actually gets saved by NAMEPLOT are the unscaled data points
plus most of the optional arguments to thee plotting function
(the exceptions are FIRST, LAST, SAME (Sec 10.2), TOP, BOTTOM,
LEFT and RIGHT (Sec 10.4) and DONT (Sec 12.5)). This is why it
works to change the scale before replotting the plot using REPLOT
(Sec 5.1).
12.2) SAVEPLOTS
SAVEPLOTS([<filespec>], <plotname1>, <plotname2>, ... ); saves the
plots <plotname1>, <plotname2> etc in the file <filespec>.
Defaulting of <filespec> is traditional (e.g., FOO is the same as
FOO,>). [<filespec>] may be omitted altogether in which case the
filespec used is [PLOTS,>,''DEVICE,''UNAME]. (This will normally
be [PLOTS,>,DSK,uname]. DEVICE and UNAME are also used by SAVE in
a similar manner.) SAVEPLOTS always sets the file defaults.
SAVEPLOTS([<filespec>], ALL); saves all the plots in PLOTS. (or else
you can say SAVEPLOT([<filespec>], PLOTS); ) Another action of
SAVEPLOTS is the put the <filespec> into the value of the saved
plots. Thus a subsequent SAVE([<filespec1>], FUNCTIONS,
<plotname>); although it won't correctly save the data in
<plotname> will remember what file it was saved in using the
SAVEPLOTS command. SAVEPLOTS returns a list of plots it succeeded
in saving.
12.3) LOADPLOTS
LOADPLOTS(<filespec>); loads a file of plots created by SAVEPLOTS.
<filespec> defaults exactly as with LOADFILE. It also sets the
file defaults. LOADPLOTS may be done within a batch (unlike
LOADFILE).
12.4) KILLPLOTS
KILLPLOTS(<plotname1>, <plotname2>, ... ); frees up the array storage
used by <plotname1> etc. KILLPLOTS(PLOTS), KILLPLOTS(ALL) and
will apply KILLPLOTS to all the members of PLOTS. Note the
KILLPLOTS does not KILL <plotname1> etc. and in particular it
leaves the <filespec> information stuck in by SAVEPLOTS. (If you
never want to reference a plot again it is probably better to do
a KILLPLOTS followed by a KILL, since KILLPLOTS takes care to
totally exorcise the arrays of the plot from the system,
something that KILL might not manage to do). If you doing a lot
of plotting then you may get a message like NO CORE ARRAY when
trying the name a plot (either by invoking NAMEPLOT explicitly or
by typing rubout after a plot.) If that happens all you have to
do is check that all the plots that are important are saved using
the SAVEPLOTS command, then do KILLPLOTS(); NAMEPLOT(<plotname>);
12.5) DONT
If DONT appears as an optional argument to the plotting functions
then the points will be calculated, but not plotted. This is
primarily of use for creating plots that are to be named and used
later. DONT is a non-sticky option (like FIRST and LAST), and so
doesn't get saved when the plot is named (so PLOT2(EXP(X), X, -1,
1, DONT); REPLOT(); will plot something).
12.6) PLOTS
In order to assist the manipulating of plots, a list of plots is
kept. The list is called PLOTS and it contains all the plots
present in the Macsyma. After KILLPLOTS is executed on a plot it
is removed from PLOTS. However if it had been previously saved
with the SAVEPLOTS (Sec 12.2) command an attempt to REPLOT (Sec
5.1) that plot it cause to reloaded from the file it was saved in
and it will be put back on the PLOTS list.
Examples
PLOT2(SIN(X), X, -%PI, %PI);
<rubout>
SNOO;
REPLOT(SNOO); replots snoo
PLOTS; ==> [SNOO]
KILLPLOTS(ALL); kills the plots in PLOTS i.e., SNOO
REPLOT(SNOO); ==> SNOO not a plot (and it wasn't saved)
REPLOT(); replots the last plot (which so happens to be the same as
SNOO)
<rubout>
ARF;
SAVEPLOTS([CFFK,PLOT,USERS], ALL); saves the plots in PLOTS
KILLPLOTS(ALL);
PLOTS; ==> [] there are now no active plots around
PROPS; ==> [SNOO,ARF] both SNOO and ARF got put on the values list
but only ARF is any good because:
SAVE([CFFK], PROPS); ==> [[CFFK, 1, DSK, USERS], SNOO, ARF]
^Z
MACSYM^K
LOADFILE(CFFK, >, USERS);
PROPS; ==> [SNOO,ARF] as before
PLOTS; ==> []
REPLOT(SNOO); ==> SNOO not a plot (It was never SAVEPLOTS'ed)
REPLOT(ARF); ==> DSK:USERS;CFFK PLOT being loaded
loading done (ARF is automatically loaded in and replotted)
PLOTS; ==> [ARF] ARF is stuck back into PLOTS
KILLPLOTS(ALL); kills the arrays in ARF but saves the fact that it
came from CFFK PLOT
REPLOT(ARF); DSK:USERS;CFFK PLOT being loaded loading done etc.
13) Transformations on points
1) POLAR, LOG, LINLOG, LOGLIN, LIN and TXTYPE
2) SPECIAL, XFUN and YFUN
3) 3D transformations and HOWCLOSE
13.1) POLAR, LOG, LINLOG, LOGLIN, LIN and TXTYPE
Easy examples
PLOT2(1, T, 0, 2*%PI, POLAR); Plots a circle
REPLOT(TRUE, LIN); Replots the previous plot on a linear
scale (i.e., gives a horizontal line)
PLOT2(EXP(X), X, 0, 10, LINLOG); Plots exp(X) on a Lin-Log scale
(appears as a straight line)
GRAPH2([1,2,5,10,50,100], [1,1.5,2.5,3,7,10], LOG); Plots some
random points on Log-Log scale. Slope shows that y=sqrt(x).
Complete description
If one of POLAR, LOG, LINLOG, LOGLIN appear as an optional argument
to one of the 2D plotting functions, then the plots appear on the
appropriate scale.
With POLAR the first arg to PLOT2 or the second arg to GRAPH2
etc. (i.e., what is normally considered to be the y
coordinate) becomes r, the radius; and what is normally
considered to be the x coordinate becomes theta, the angle.
LOG causes both axes to appear on a log (base 10) scale.
LINLOG causes the y axis to appear on a log scale.
LOGLIN causes the x axis to appear on a log scale.
LOGLOG is the same and LOG.
The optional arguments LOG and LOGLIN also cause PLOT2 to choose
logarithmic intervals for the x variable, if the <low>, <high>
form of range specification is used (Sec 1.1). (Something less
than optimal probably happens for PARAMPLOT2 in this case).
CONTOURPLOT2 (Sec 4.1) is regarded as being a 2D plotting function
(since it does not transform its x and y coordinates). Thus the
above optional args work on it and CONTOURPLOT2(Y, X, 0, 2*%PI,
Y, 0, 1, POLAR); does the right thing.
Note that when a plot is saved the points before their transformation
are saved, together with the type of transformation. Thus is
possible to change the transformation either using REPLOT (Sec
5.1) or a ^A break (Sec 2.6).
With REPLOT all that is necessary is to supply an optional arg
overriding the one originally given. LIN is an optional argument
that specifies no transformation (i.e., a LINear scale in both
directions). This can be given to REPLOT to turn off any
transformations.
In a ^A break the variable TXTYPE is (locally bound) to the type of
transformation. Thus within a polar plot TXTYPE is POLAR. A value
of FALSE implies no transformation (like LIN in REPLOT). The
possible values of TXTYPE are FALSE, POLAR, LOG, LINLOG, LOGLIN,
SPECIAL (for user defined transformations (Sec 13.2)), and NOT3D
(for Not3d plots (Sec 3.3) and (Sec 13.3)). Remember that after
exiting the break the plot must be replotted (with a tab (Sec
2.3)) for the change in TXTYPE to be saved.
13.2) SPECIAL, XFUN and YFUN
If the optional argument SPECIAL appears in the call to PLOT2 then
immediately before sticking your data up on the screen PLOT2
looks at the values of XFUN and YFUN (default values are FALSE).
If they are FALSE the data gets scaled in the normal way and is
plotted without further ado. If either is non-FALSE then it
should be the name of a function of 1 to 3 arguments which
defines a transformation between the data and the x and y screen
coordinates. (The standard linear scaling is still applied the
result of this transformation, to make your plot fit on the
screen.) The functions must be translated or compiled and must
return a floating point result. the way they work is best
illustrated by an example.
Suppose
XFUN:POLARX;
YFUN:POLARY;
where POLARX and POLARY are defined by
TRANSLATE:TRUE;
POLARX(X, Y) := (MODEDECLARE([X,Y], FLOAT), Y*COS(X));
POLARY(X, Y) := (MODEDECLARE([X,Y], FLOAT), Y*SIN(X));
(note that X and Y are the THETA and R coordinates of a polar
system) then
PLOT2(1, X, 0, 2*%PI, SPECIAL);
produces PLOTNUM x data points (ranging from 0 to 2*%PI)
and PLOTNUM corresponding y data points (all 1 in this case).
These x and y are given to the POLARX and POLARY functions as
the first and second arguments and the value of these two
functions is what is supplied to the normal scaling routines.
Thus this PLOT2 command will produce a circle (if
EQUALSCALE:TRUE (Sec 8.3), an ellipse otherwise). What I've
just described could of course all be done with the POLAR
optional arg (Sec 13.1). But then I've just described pretty
much what happens when you give the POLAR optional arg.
The arguments that XFUN and YFUN take are
1 arg 2 args 3 args
XFUN x x,y x,y,z
YFUN y x,y x,y,z
The first argument to PLOT2 is considered a y variable and it's
second argument an x variable. For PARAMPLOT2 and GRAPH2 the
first arguments are x variables and the second arguments are y
variables. For all the 2D plotting functions the z variable is
0.0. (See (Sec 13.3) for the coordinate conventions for the 3d
plotting functions).
In fact POLARX and POLARY come predefined in the PLOT2 files. Other
XFUN's and YFUN's that may be of use are (omitting the
MODEDECLARE's):
CLOG(X) := (IF X=0.0 THEN -90.0 ELSE LOG(ABS(X)))/LOG(10.0);
REFLECT(X) := -X;
YTOX(X,Y) := Y;
XTOY(X,Y) := X;
ZTOY(X,Y,Z) := Z;
ZTOX(X,Y,Z) := Z; (just the same function really)
ROTATEX(X,Y) := X*COSANG-Y*SINANG;
ROTATEY(X,Y) := X*SINANG+Y*COSANG;
(SINANG and COSANG are set up by
INITROTATE(ANG) := (COSANG:COS(ANG), SINANG:SIN(ANG));)
Example
XFUN:YTOX;
YFUN:XTOY; These cause X and Y to be swapped
PLOT2(SIN(X), X, -%PI/2, %PI/2, SPECIAL); Plots arcsin(x) vs. x !
The XFUN's and YFUN's implied by the optional args in (Sec 13.1) are:
optional arg XFUN YFUN
POLAR POLARX POLARY
LOG CLOG CLOG
LINLOG FALSE CLOG
LOGLIN CLOG FALSE
LIN FALSE FALSE
13.3) 3D transformations and HOWCLOSE
The perspective transformations (Sec 3.4) work by the same XFUN and
YFUN mechanism documented above. In case to want to try changing
the transformation here are the names of the functions used
(although it is probably quite easy to confuse the function that
figures out the hidden lines).
The hidden line routine also makes use of the variable HOWCLOSE.
HOWCLOSE should evaluate a the name of a function of 3 arguments (x,
y and z) and should give a measure of how close the point [x,y,z] is
to the viewer. It is not necessary that this function return the
exact distance [x,y,z] is away, just that the further away [x,y,z]
is, the larger the number the function should return.
CENTERPLOT PERSPECTIVE REVERSE XFUN YFUN HOWCLOSE
-----------------------------------------------------------------------
non-FALSE TRUE FALSE P3DX P3DY HOWCLOSE3D
non-FALSE TRUE TRUE P3DXR P3DYR HOWCLOSE3D
non-FALSE FALSE FALSE NP3DX NP3DY HOWCLOSENP3D
non-FALSE FALSE TRUE NP3DXR NP3DYR HOWCLOSENP3D
FALSE TRUE FALSE OLD3DX OLD3DY HOWCLOSEOLD3D
FALSE TRUE TRUE OLD3DXR OLD3DYR HOWCLOSEOLD3D
FALSE FALSE FALSE OLDNP3DX OLDNP3DY HOWCLOSEOLDNP3D
FALSE FALSE TRUE OLDNP3DXR OLDNP3DYR HOWCLOSEOLDNP3D
The type of view is setup by doing
INITPERSPEC(CX,CY,CZ,VX,VY,VZ);
where [VX,VY,VZ] the VIEWPT and [CX,CY,CZ] is the CENTERPLOT
The optional argument NOT3D now causes YFUN to be bound to ZTOY.
14) Editting plots
1) EDIT
Tektronix users only: there exists a facility for editting pictures
using the crosshairs on a Tektronix terminal. This enables you to
position labels accurately and add in additional lines, arrows etc.
To load the editting package do
LOAD('[EDIT, FASL, DSK, CFFK]);
The behavior of a particular Tektronix terminal to characters typed
while the crosshairs are displayed is governed by strap settings
inside the terminal. Of importance to this package is whether the
terminal sends out a following <return> after the position
information. The variable EDITCR (default FALSE) should reflect this
strap setting. (A TRUE value means that EDIT expects a following
<return>.) This parameter is set to its default value when the
package is loaded; so set it to the correct value after loading in
EDIT.
14.1) EDIT
The main function in the package is called EDIT and its intention is
to allow you to enter labels and various odd lines onto an
existing plot. To use it you must have a function of no
arguments, whose body is a BLOCK and the last statement in the
BLOCK must be EXITGRAPH(). If the function is P(), say then P();
should plot as much of your picture as can be conveniently
specified by PLOT2, GRAPH2 etc.
EDIT(P); will execute P(), but will stop before the final EXITGRAPH()
and display the cross-hairs. By typing various letters EDIT will
enter commands into the function P directly before the
EXITGRAPH(),
Allowed letters are:
Rubout or Q or q, exit from EDIT
Space, save the location of the crosshairs (for use with L and A)
S or s, enters a SETPOINT command into your function
V or v, enters a VECTOR command (should be preceded by a SETPOINT
or another VECTOR command)
L or l, draws a line between the saved location and the
crosshairs and enters it in the function.
A or a, draws an arrow head pointing in the direction from the
saved location to the crosshairs. The tip of the arrow is at
the crosshairs. The size of the arrow is ARROWSIZE (a
floating point number in raster units, default value 20.0)
and its half angle is ARROWANG (a floating point number in
radians, default value 0.2). (The arrow is drawn using the
?ARROW function, defined in EDIT FASL. It takes 4 integer
arguments, similarly to ?LINE (Sec 16). Thus
?LINE(20,20,100,100), ?ARROW(20,20,100,100) draws a line with
an arrow head on it.)
P or p, reads text from the keyboard and prints it left justified
at the cursor. Echoing is suppressed while it is reading the
text. Reading continues until a Carriage-Return is
encountered. The case of the text is remembered, but if you
want it preserved after, say, STRINGOUT'ing and BATCH'ing you
should set BOTHCASES:TRUE;
C or c, same as P, except the text is centered.
R or r, same as P, except the text is right justified
Remember that after exiting EDIT your function will have been
changed, so that P(); should give you the updated PLOT. Items may
be be removed using the MACSYMA editor, or TECO. To draw a
picture from scratch you could do:
HOUSE() := BLOCK([], ENTERGRAPH(), SCREENSIZE(0,0,1023,790),
EXITGRAPH()); the call to SCREENSIZE is advisable
in case the previous call to PLOT2 set the plotting window
to less than the whole screen.
EDIT(HOUSE); now with a sequence of S's and V's you can draw a
house terminating it with a Rubout.
HOUSE(); re-draws your house.
Setting WINDOW is not going to have any effect, since only the top
level plotting functions pay any attention to it (and they then
call SCREENSIZE).
Here's how you might define a function to enable you to use EDIT to
insert anotations.
ANOTATE():=BLOCK([],
PLOT2([SIN(X),COS(X)],X,-%PI,%PI,[0,1],FIRST),
ENTERGRAPH(),
CLEAR:WAIT:TRUE, undo the effect of the FIRST
CHANGEDASH(0), undo the dashed line mode
EXITGRAPH());
EDIT(ANOTATE);
15) Default settings
1) Options
2) Lines and Symbols
3) PLOTMODE
15.1) Options
The defaults for the options are:
PLOTNUM:20;
PLOTNUM0 unbound
PLOTNUM1:20;
EQUALSCALE:FALSE;
NOPRINT:FALSE;
DATEPLOT:TRUE;
XAXIS:ALL;
YAXIS:ALL;
TICKNUM:10;
TICKSIZE:6;
UNDERSIDE:TRUE;
REVERSE:FALSE;
PERSPECTIVE:TRUE
PLOTNUMPREC:7;
CONTOURS:20;
LABELCONTOURS:TRUE;
VIEWPT unbound
CENTERPLOT unbound
CROSSHATCH:TRUE;
WINDOW unbound
XMAX,XMIN,YMAX,YMIN,ZMAX,ZMIN unbound
XFUN:FALSE;
YFUN:FALSE;
CLEAR:TRUE;
WAIT:TRUE;
PLOTBELL:TRUE;
PLOT2ERROR:TRUE;
PLOTGAP:20;
** PLOTSCALE:1.0;
** PLOTTHICK:2;
** PLOTLFTMAR:150
** PLOTBOTMAR:150
** CHARRATIO:2.5;
** CRCLEAR:TRUE;
** HARDCOPY:TRUE;
** PADDED:IS(SPEED>2400);
** LINEL (terminal dependent)
** PLOTHEIGHT (terminal dependent)
** PLOTMODE (terminal dependent) (Sec 15.3)
** TEK4662:FALSE;
** TEK4025:FALSE;
(** not reset by PLOTRESET();)
The switches whose default state is unbound are put on the VALUES
list when they are given a value. The other switches get put on
the MYOPTIONS list when they get changed. So all options can be
saved by doing SAVE([<fn1>, <fn2>, <dir>],MYOPTIONS,VALUES);)
The following are "read-only" options (sec 8.4)
XMAX1,XMIN1,YMAX1,YMIN1,ZMAX1,ZMIN1
VIEWPT1,CENTERPLOT1
WINDOW1
XMAX3D,XMIN3D,YMAX3D,YMIN3D,ZMAX3D,ZMIN3D
15.2) Lines and Symbols
See (Sec 9). The defaults for the dashed lines are (not reset by
PLOTRESET();):
DEFINEDASH(0,FALSE); (solid line)
DEFINEDASH(1,[40,8]);
DEFINEDASH(2,[15,8]);
DEFINEDASH(3,[1,7]);
DEFINEDASH(4,[30,8,1,8]);
DEFINEDASH(5,[30,8,1,8,1,8]);
DEFINEDASH(6,[40,8,1,8,5,8,1,8]);
DEFINEDASH(7,[8,30]);
DEFINEDASH(8,[1,20]);
DEFINEDASH(9,TRUE]); (no line)
The defaults for the symbols are (not reset by PLOTRESET();):
DEFINESYMBOL(0,FALSE); (no symbol)
DEFINESYMBOL(1,[[0,6],[0,-6],[-6,0],[6,0],[0,0]]);
DEFINESYMBOL(2,[[4,4],[-4,-4],[4,-4],[-4,4],[0,0]]);
DEFINESYMBOL(3,[[6,6],[6,-6,-6,-6,-6,6,6,6],[0,0],[0,0]]);
DEFINESYMBOL(4,[[8,0],[0,-8,-8,0,0,8,8,0],[0,0],[0,0]]);
DEFINESYMBOL(5,[[0,8],[6,-4,-6,-4,0,8],[0,0],[0,0]]);
DEFINESYMBOL(6,[[0,-8],[6,4,-6,4,0,-8],[0,0],[0,0]]);
DEFINESYMBOL(7,[[8,0],[-4,6,-4,-6,8,0],[0,0],[0,0]]);
DEFINESYMBOL(8,[[-8,0],[4,6,4,-6,-8,0],[0,0],[0,0]]);
DEFINESYMBOL(9,TRUE); (point)
For PLOTMODE(PRINTING); or PLOTMODE(DISPLAY) the default line and
symbol characters (defined by e.g., DEFINESYMBOL(1,"A");) are
0 1 2 3 4 5 6 7 8 9
lines . * # $ % & + @ - none
symbols none A B C D E F G H I
15.3) PLOTMODE
See (Sec 5.2). Unless you set the PLOTMODE before PLOT2 is loaded,
PLOTMODE gets initialized according to LISP's TTY variable as
follows:
TTY PLOTMODE
0 PRINTING
1 DISPLAY (datapoint)
2 DISPLAY (datapoint)
3 IMLAC
4 TEKTRONIX
5 DISPLAY (TV these may soon be supported)
6 PRINTING (memowreck)
7 (software tty) depends on the terminal characteristics
as follows (this is the order the questioning are
asked)
Can't do cursor positioning PRINTING
Can't selectively erase TEKTRONIX
Can't overprint DISPLAY
An IMLAC (%TOIML) IMLAC
Not an AI-TV GRINNELL
Else DISPLAY
8 PRINTING (terminet)
9 DISPLAY (other display)
If WINDOW is unbound then it is chosen according to PLOTMODE as
follows:
if GOULD then [0, 1023, 5, 790]
else if TEKTRONIX then [0, 1023, 5, 790]
else if IMLAC then [0, 1023, 200, 1006.))
else if PRINTING or DISPLAY then
[0, <char-width>*LINEL-1, 0, <char-height>*PLOTHEIGHT-1]
else [0, 1023, 0, 1023]
E.g if PLOTMODE:[I,G], WINDOW is chosen to be [0, 1023, 5, 790]
(because the GOULD condition is satisfied first).
For PRINTING or DISPLAY terminals <char-width> and <char-height> are
chosen to make WINDOW be close to that for the other devices. The
formulas used are:
<char-width> = 1 + ENTIER(1023/LINEL)
<char-height> = ENTIER(0.5 + CHARRATIO*<char-width>)
16) Primitives called by PLOT2
With the following functions practically no argument checking is
done. So make sure a function gets floating-point numbers or
integers as it needs them. In particular <xf>, <xf1>, <yf>, <yf1>
should all be floating point (unscaled) screen coordinates and
<x>, <x1>, <y>, <y1> should be integer screen coordinates after
all scaling. Some of the basic functions below come in 3
versions.
The one with the ? in front is the most basic. Its arguments are
in screen raster coordinates.
The middle one accepts floating point arguments as screen
coordinates before the last stage of (linear) scaling is
done.
The last one with a 3 at the end takes x, y and z arguments and
applies the transformation functions (set up with ?CALL\-INIT
to them).
?SETPOINT(<x>,<y>); absolute setpoint
SETPOINT(<xf>,<yf>);
SETPOINT3(<xf>,<yf>,<zf>);
?POINT(<x>,<y>); absolute point
POINT(<xf>,<yf>);
POINT3(<xf>,<yf>,<zf>);
?VECTOR(<x>,<y>); absolute vector
VECTOR(<xf>,<yf>);
VECTOR3(<xf>,<yf>,<zf>);
?LINE(<x1>,<y1>,<x>,<y>); line
LINE(<xf1>,<yf1>,<xf>,<yf>);
LINE3(<xf1>,<yf1>,<zf1>,<xf>,<yf>,<zf>);
CHANGEDASH(<n>); change to dashed line <n>
PUSHDASH(); change to dashed line 0 temporally
POPDASH(); undo PUSHDASH()
?DRAWSYMBOL(<x>,<y>,<n>); draw symbol n
DRAWSYMBOL(<xf>,<yf>,<n>);
DRAWSYMBOL3(<xf>,<yf>,<zf>,<n>);
?TEK\-X(<xf>); converts unscaled screen coordinates to raster coords.
?TEK\-Y(<yf>);
?TEK\-XF(<x>); converts raster coordinates to unscaled screen coords.
?TEK\-YF(<y>);
SCREENSIZE(<min-x>,<min-y>,<max-x>,<max-y>); sets the window in
which plotting is done. If a vector goes outside this window
it will be clipped
SCREENSIZE1(<min-x>,<min-y>,<max-x>,<max-y>); same as SCREENSIZE
except that the scale is left unchanged. SCREENSIZE leaves
<min-xf> etc. unchanged
SIZE(<min-xf>,<min-yf>,<max-xf>,<max-yf>); sets the scale so that
<min-xf>,<min-xf> gets plotted at <min-x>,<min-y> etc.
?CALL\-X(<xf>,<yf>,<zf>); applies transformation routines to give
?CALL\-Y(<xf>,<yf>,<zf>); unscaled screen coords.
?CALL\-INIT(<xfun>,<yfun>); initialized transformation routines to
use <xfun> and <yfun>
CLEAR(); clears the screen.
ENTERGRAPH(); should be done before a sequence of plotting.
It will clear the screen if CLEAR is TRUE.
EXITGRAPH(); should be done after a sequence of plotting.
If WAIT is TRUE it will wait for you to type in a char and
will return its ASCII value. If HARDCOPY is also TRUE will
do a HARDCOPY().
HARDCOPY(); sends out a hardcopy signal (Sec 5.4).
GHPRINT(<l>,<x>,<y>,<a>); prints <l> at (raster) coordinates
<x>,<y>. <a>=0 ==>left justify, <a>=1 ==> center, <a>=2 ==>
right justify. Add 10 to <a> to get <l> underlined. <l> may
be a list, in which case its element are concatenated together
GVPRINT(<l>,<x>,<y>,<a>); prints <l>. <a>=1, 2, or 3 meaning
top justify, center, or bottom justify.
17) What PLOT2 doesn't do
Currently PLOT2 doesn't do all that you might ask of a plotting
package. Here is a list of these shortcomings. Some of them may get
fixed one of these days.
Decent numbering of axes. (Labelling of each tickmark, provision for
major and minor tick intervals, labelling of the axes in such a
way that the labels don't overlap, provision for a remote
exponent, etc.) This is provided by most other plotting
packages. The numbering in PLOT2 is something of an afterthought.
The problem is that getting the numbers done right will need a
fair amount of code which will take up precious room in your
MACSYMA. My suggestion to those who need beautiful numbering is
to get PLOT2 to only plot the lines and curves and then to get a
draftsman to put in the labels exactly where you want them. Those
who dislike the intrusion of a third party into the preparation
of their plots should try using the EDIT function on a Tektronix.
(I have successfully used this to prepare the figures for my
thesis. This required additional hacking to get the whole process
interfaced with TXJ.)
Tickmarks at log-spaced intervals on LOG plots. (Currently the axes
are treated exactly the same as for linear plots.) This would be
easier to put in. In the meantime, it is fairly easy to write a
routine to put them in "manually" using GRAPH2 (Sec 18).
Axes on 3D plots. These can be put in with some effort using GRAPH3D.
(No hidden line removal will happen though.)
Spline or polynomial interpolation of curves.
Provision for having the symbols on curves being characters. PLOT2
used to do this. But it was dis-installed when the graphic
symbols were introduced. At present they can be put in with
GHPRINT (Sec 18).
Shading of arbitrary areas.
3D plots on something other than a rectangular grid. In theory this
is possible using the transformation routines. However these will
only work for rather simple transformations. (I suppose the
restriction is that the space has to be topologically Euclidean
in the region being plotted.) Thus there is no convenient way to
plot, for instance, the surface of a torus.
Something goes wrong with the 3D transformation used by PLOT3D when
the scales of the various directions are vastly different. (E.g.,
if the x range is 1.E-6 and the z range is 1.E6.) If this happens
you must prescale your points. If enough people complain, I could
put the scaling as an option in the defaults 3D transformation
routines (Sec 13.3).
18) Other examples
Here is a collection of more complicated examples and some other
information that people might need to get the most out of PLOT2.
The following program plots the FFT (fast Fourier transform) of 2
randomly placed delta functions (idea from some Tektronix
literature). This generates a quite pleasing sequence of
pictures.
ARRAY([AR,AI],FLOAT,255);
LOAD('[FFT,FASL,DSK,SHARE]);
PL():=BLOCK([EQUALSCALE:TRUE, XAXIS:FALSE, YAXIS:FALSE],
FILLARRAY(AR,'[0.]), FILLARRAY(AI,'[0.]),
THRU 2 DO AR[RANDOM(256)]:1.,
FFT(AR,AI),
GRAPH2(ENDCONS(AR[0],LISTARRAY(AR)),
ENDCONS(AI[0],LISTARRAY(AI))));
PL(); each call gives a different picture.
Here's how to put characters on a plot. We draw sine and cosine
curves and label the points with S and C.
PRT(L,X,Y):=GHPRINT(L,?TEK\-X(X),?TEK\-Y(Y),1);
BLOCK([A:0.,B:EV(%PI/2,NUMER),RANGE:[]],
PLOT2([SIN(X), COS(X)], X, 0, %PI/2, FIRST),
ENTERGRAPH(),
CLEAR:WAIT:TRUE,
FOR I FROM 0 THRU PLOTNUM-1 DO
RANGE:CONS(FLOAT(A+I*(B-A)/(PLOTNUM-1)),RANGE),
FOR X IN RANGE DO PRT("S", X, SIN(X)),
FOR X IN RANGE DO PRT("C", X, COS(X)),
EXITGRAPH());
Compiling PLOT2 functions. Because most of the main plotting
functions evaluate their arguments specially, the compiler is
inhibited from generating very efficient code for any function
containing one of PLOT2's main functions. Here is what to do if
you want to get the extra speed of compiled code: Don't write one
big long function that does everything, initialization of
parameters, the main calculation, and the plotting. Rather try
and split things up so that the time consuming stuff is off in
its own functions. The results of the calculation can either be
communicated to the rest of the world via the value of the
function or (when it is more convenient to have a lot of results
calculated at once) via arrays. An example might be to plot
INTEGRATE(INTEGRATE(F(X,Y,A), X, 0, 1), Y, 0, 1) as a function of
A. Here you would want to just define a function P(A) which
numerically evaluates this integral for a particular value of A
(you could call the SHARE; routine ROMBERG for instance), and
then do PLOT2(P(A),A,0,1);. Here you could write P(A) is such a
way that it compiles well because it doesn't involve any calls to
plotting functions. This approach is also preferable because it
enhances the maintainability and readability of the program.
Furthermore it is easy to switch it into "batch" mode where
MACSYMA can be calculating and storing values overnight and you
can then peruse the results graphically in the morning.
Note on contour plotting. CONTOURPLOT2 sometimes gives what look like
wrong results. Here's a brief description of how the contouring
works which will help you to understand these results.
CONTOURPLOT2 calculates the value of your function on a
rectangular grid of points. These values alone are not enough to
determine the topology of the contours. So CONTOURPLOT2 inserts a
new point in the center of each rectangular cell whose height is
the mean of the 4 corners. The surface to be contoured is then
assumed to made up of triangles each of whose bases is one of the
sides of the cell and whose vertices is the center of the cell.
CONTOURPLOT2 then plots the exact contours for this surface. This
method guarantees that the contours have all the properties
contours should have (no 2 contours of different heights cross, a
contour of a given height cannot form a "Y", etc.); however, they
are sometimes jagged near saddle points. There is a variable DIAG
(which is not maintained as a proper user-settable variable)
which governs one detail of the contouring. If it is TRUE (the
default), then contours are drawn as described above. In general
the contours of the triangular surface change direction on both
the edges and diagonals of the rectangular cells. However if you
do DIAG:FALSE; then only the intercepts of the contours with the
edges of the cells are used in drawing the contours. This
sometimes gives "better" results.
Stochastic plot. There are times when you want masses of data plotted
and the computation of the data is cheap. Then it is better to
use the screen as a storage medium, rather than sticking the data
into arrays. Here's how to get a plot generated by a stochastic
map:
(TPI:EV(2*%PI,NUMER),K:0.);
INIT(K1):=BLOCK([XMIN:0., YMIN:0., XMAX:TPI, YMAX:TPI,
EQUALSCALE:TRUE],
K:K1,
GRAPH2([], [], FALSE, FALSE, LABEL(K), FIRST),
ENTERGRAPH(),
CLEAR:WAIT:TRUE);
PLT(X0,Y0,N):=(DECLARE([TPI,K], SPECIAL),
MODEDECLARE([X0,Y0], FLOAT, N, FIXNUM),
DRAWSYMBOL(X0,Y0,2),
BLOCK([X:X0,Y:Y0],
MODEDECLARE([TPI,K,X,Y], FLOAT, I, FIXNUM),
FOR I THRU N DO (Y:Y-K*SIN(X),
Y:Y-TPI*FLOAT(ENTIER(Y/TPI)),
X:X+Y,
X:X-TPI*FLOAT(ENTIER(X/TPI)),
POINT(X,Y))));
COMPILE(PLT);
(INIT(1.), PLT(TPI/2.,1.E-3,5000), EXITGRAPH());
People sometimes complain that the numbers labelling the axes often
appear inside plotting window and 2 numbers appear on top of each
other because of this. If this is a serious problem the following
will solve it (although admittedly not very easily). Suppose you
want do PLOT2(X, X, 1, 2); then you could do:
BLOCK([YMAX, YMIN, XMAX, XMIN, DATEPLOT, NOPRINT, XAXIS, YAXIS,
WINDOW, OWINDOW],
WINDOW:OWINDOW:[100,1023,100,790], allow 100 raster units for
writing in later
DATEPLOT:XAXIS:YAXIS:FALSE, turn off things that print
NOPRINT:TRUE,
PLOT2(X, X, 1, 2, FIRST), plot
YMAX:YMAX1, YMIN:YMIN1, XMAX:XMAX1, XMIN:XMIN1, save XMAX etc
BLOCK([XMIN, XMAX, YAXIS], push XMIN etc
XMIN:-1, XMAX:1,
WINDOW:COPYLIST(OWINDOW), WINDOW[1]:0, WINDOW[2]:200,
YAXIS:ALL,
GRAPH2([], [])), plot Y axis
BLOCK([YMAX, YMIN, XAXIS], do same for X axis
YMAX:1, YMIN:-1,
WINDOW:COPYLIST(OWINDOW), WINDOW[3]:0, WINDOW[4]:200,
XAXIS:ALL,
GRAPH2([], [], LAST)));
19) Acknowledgements
PLOT2 was primarily written by me (Charles Karney) during 1975-76
while I was a graduate student in the Plasma Physics Group of the
Department of Electrical Engineering and Computer Sciences at MIT.
Several other members of the Plasma Physics Group contributed
assistance and ideas. In particular John Kulp was responsible for
overseeing the computational side of the group's activities and
installed the system of graphics terminals that allowed MACSYMA to
become a useful tool for online graphics.
This work was supported by the Department of Energy.
|