Examples of what can be done
with the Pop-11 RC_GRAPHPLOT package
(Part of RC_GRAPHIC
and
RCLIB).
RC_GRAPHPLOT_DEMO Aaron Sloman Aug 2009
USING LIB RC_GRAPHPLOT AND LIB RC_GRAPHPLOT2
Below are some examples of what can be done by giving commands using the
RC_GRAPHPLOT and RC_GRAPHPLOT2 extensions to Pop-11's RC_GRAPHIC library.
(With thanks to David Young at Sussex University.)
Together these provide a fairly versatile package for interactively
drawing graphs of functions specified in a variety of ways, as explained
in the TEACH and HELP files.
TEACH RC_GRAPHPLOT
Introduction, with many examples (some included below with graphical
output).
HELP RC_GRAPHPLOT
Terse summary documentation on the package.
-- Getting started
These commands load the library facilities:
uses popxlib;
uses rc_graphplot
uses rc_graphplot2
Example 1: Plotting the built-in function 'log'
;;; Plot the function log(x) from x = 1 to x = 10 in steps of 1/10
;;; create an empty picture
rc_start();
;;; variable to hold the output of rc_graphplot.
vars region;
rc_graphplot( 1, 1/10, 10, 'X', log, 'log(X)') -> region;
This is what is displayed:
;;; The resulting list, region, shows the rounded bounds of the
;;; rectangle containing the resulting graph:
region =>
** [1 10 0 3]
;;; I.e., as x moved between 1 and 10, y remained between. 0 and 3
Example 2: Plotting the user-defined function 'myfunc'
define myfunc(x) -> y;
;;; A function to be plotted - actually a polynomial
lvars x y;
2 * x**4 + x**3 - 16 * x**2 + 50 -> y
enddefine;
;;; Plot the function myfunc(x) from x = -3 to x = 3 in steps of 1/10
rc_graphplot( -3, 1/10, 3, 'X', myfunc, 'Y') -> region;
region ==>
** [-3 3 0 110]
;;; Here the maximum value of y is 110
region ==>
** [-3 3 0 110]
;;; Here the maximum value of y is 110
Example 3: Plotting specific data-points
Suppose you have done an experiment and recorded some data you would
like to plot, and that you have stored them in a Pop-11 data structure
such as a list, a vector, an array, or a string. To simulate this, load
these two lines of code:
vars mydata;
[13 12 7 3 1 1 19 29 25 20 undef 15 10 3 -3 2 1] -> mydata;
The "undef" value means that something went wrong and there is no value
for this time. Let's say the data were collected at 5-second intervals,
starting at 20 seconds into the experiment. This would then be an
appropriate call to the routine:
rc_graphplot( 20, 5, 100, 'time (s)', mydata, 'Data') -> region;
Which produces:
region =>
** [20 100 -10 35]
Example 4: Plotting x and y together - separate data sets or functions
If you have two sets of data, and you want to plot one set against the
other, you simply pass these to graphplot with the x data first, each
set followed by its label. The data can be lists, vectors, arrays, or
any other subscriptable structure. In this example, the two vectors
might represent the x and y coordinates of moving object, for example.
vars xvals, yvals, region;
{ 2 3 2 3 5 7 8 7 8 6 4} -> xvals;
{20 24 28 30 31 28 33 26 19 23 24} -> yvals;
rc_graphplot(xvals, 'X', yvals, 'Y') -> region;
region =>
** [1 9 16 36]
This would do the same:
vars xyvals;
[{2 20} {3 24} {2 28} {3 30} {5 31} {7 28} {8 33} {7 26} {8 19}
{6 23} {4 24}] -> xyvals;
;;; Use RC_GRAPHPLOT2
uses rc_graphplot2
rc_graphplot2(xyvals, 'X', 'Y') -> region;
Example 5: Plotting x and y together - combined data set or function
Sometimes, it may be more convenient to store x-y data as a single data
structure containing pairs of values, or to plot the results of a single
function which returns x and y values together. To do this, you will
need to load a different version of graphplot - LIB * GRAPHPLOT2, thus:
;;; Define a function that produces two values each time it is
;;; called.
define xy_func(t) -> (x,y);
lvars t x y;
t * cos(t) -> x;
t * sin(t) -> y
enddefine;
;;; Plot this for values of t from 0, increasing by 2, to 3200:
rc_graphplot2(0, 2, 3200, xy_func, 'X', 'Y') -> region;
See the automatically computed bounds:
region =>
** [-4000 4000 -4000 4000]
Example 6 Plotting points instead of lines
You might prefer to plot points on the graph instead of drawing lines
between the data points or function values. This can be done by changing
the value of one of the many controlling global variables, like this:
;;; Use RC_GRAPHPLOT2
uses rc_graphplot2
;;; data to be plotted
vars xyvals;
[{2 20} {3 24} {2 28} {3 30} {5 31} {7 28} {8 33} {7 26} {8 19}
{6 23} {4 24}] -> xyvals;
;;; specify shape to be drawn at each point
"plus" -> rcg_pt_type;
;;; specify diameter of shape
20 -> rcg_pt_cs;
rc_graphplot2( xyvals, 'X', 'Y') -> region;
The region
region =>
** [1 9 16 36]
You will find that the individual points are plotted with "plus" signs.
Other words that you can assign to rcg_pt_type are "square", "cross",
"plus" and "circle". More might be added in due course. You can assign a
plotting procedure of your own to rcg_pt_type - it must take two
arguments, x and y.
Example 7: Repeat but drawing circles instead of crosses
"circle" -> rcg_pt_type;
30 -> rcg_pt_cs;
rc_graphplot2( xyvals, 'X', 'Y') -> region;
That produces
To get back to drawing lines, do this:
"line" -> rcg_pt_type;
Example 8: Drawing several graphs on the same axes
So far, the program has started setting the scales from scratch for each
graph, and has cleared the window between graphs. Often, however, you
will want to put several curves or sets of data on the same axes. Let's
plot some data, and a curve (the square root function) that happens to
fit them approximately, on the same axes. We start by setting up some
more synthetic data and plotting them, using crosses of diameter 20:
rc_start();
vars moredata;
[0.1 0.9 1.3 1.8 1.95 2.2 2.5 2.9 3.1 3.2 3.4 3.45 3.5] -> moredata;
"cross" -> rcg_pt_type;
20 -> rcg_pt_cs;
rc_graphplot(0, 1, 12, 'X', moredata, 'Y') -> region;
We'll now change the plotting style so that the theoretical function
comes out as a line:
"line" -> rcg_pt_type; ;;; make it look different
Now we change some more global variables and plot the curve for sqrt.
false -> rcg_newgraph; ;;; don't clear the window
region -> rcg_usr_reg; ;;; use same axes as before
undef -> rcg_win_reg; ;;; use same bit of window as before
rc_graphplot(0, 1/10, 12, false, sqrt, false) -> region;
More examples can be found in TEACH RC_GRAPHPLOT
This file maintained by:
Aaron Sloman
http://www.cs.bham.ac.uk/~axs/
Last Updated: 24 Aug 2009
Installed: 24 Aug 2009