![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
You may want to plot something not directly supported by one of the plotting primitive functions. Usually, you can write your own plotting function to perform such a task. As an example, suppose you want to plot a histogram – that is, instead of a smooth curve connecting a series of (x,y) points, you want to draw a line consisting of a horizontal segment at each value of y, joined by vertical segments (this is sometimes called a Manhattan plot for its resemblance to the New York City skyline).
You quickly realize that to draw a histogram, you really need the x values at the vertical segments. This function works:
func plh(y,x)
{
yy = xx = array(0.0, 2*numberof(y));
yy(1:-1:2) = yy(2:0:2) = y;
xx(2:-2:2) = xx(3:-1:2) = x(2:-1);
xx(1) = x(1);
xx(0) = x(0);
plg, yy, xx;
}
|
Notice that the x array must have one more element that the y array; otherwise the assignment operations to xx will fail for lack of conformability.
A more sophistocated version would include the possibility for the caller to pass plh the keywords accepted by the plg function. Also, you might want to allow y to have one more element than x instead of x one more than y, in order to start and end the plot with a vertical segment instead of a horizontal segment. Here is a more complete version of plh:
func plh(y,x,marks=,color=,type=,width=)
/* DOCUMENT plh, y, x
plot a histogram (Manhattan plot) of Y versus X. That is,
the result of a plh is a set of horizontal segments at the Y
values connected by vertical segments at the X values. If X
has one more element than Y, the plot will begin and end with
a horizontal segment; if Y has one more element than X, the
plot will begin and end with a vertical segment. The keywords
are a subset of those for plg.
KEYWORDS: marks, color, type, width
SEE ALSO: plg
*/
{
swap = numberof(x)<numberof(y);
if (swap) { yy = y; y = x; x = yy; }
yy = xx = array(0.0, 2*min(numberof(y),numberof(x)));
yy(1:-1:2) = yy(2:0:2) = y;
xx(2:-2:2) = xx(3:-1:2) = x(2:-1);
xx(1) = x(1);
xx(0) = x(0);
if (swap) { y = yy; yy = xx; xx = y }
plg, yy, xx, marks=marks, color=color, type=type, width=width;
}
|
The point of an interpreted language is to allow you to easily alter the user interface to suit your own needs. Designing an interface for a wide variety of users is much harder than designing one for your own use. (The first version of plh might be adequate for your own use; I wouldn’t release less than the second version to a larger public.) Linking your routines to the Yorick help command via a document comment is useful even if never anticipate anyone other than yourself will use them. Public interface routines should always have a document comment.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
