0% found this document useful (0 votes)
120 views

Drawing Graphs With Metapost: John D. Hobby

This document describes a graph-drawing package implemented as an extension to the MetaPost graphics language. The package allows users to easily generate graphs from data files, with features such as automatic scaling, grid lines, multiple coordinate systems including linear and logarithmic scales, and the ability to handle large numbers. The package is implemented using MetaPost's macro facility and provides functionality for basic graph drawing commands, manipulating coordinate systems, and typesetting labels and numbers.

Uploaded by

mihaimiit
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
120 views

Drawing Graphs With Metapost: John D. Hobby

This document describes a graph-drawing package implemented as an extension to the MetaPost graphics language. The package allows users to easily generate graphs from data files, with features such as automatic scaling, grid lines, multiple coordinate systems including linear and logarithmic scales, and the ability to handle large numbers. The package is implemented using MetaPost's macro facility and provides functionality for basic graph drawing commands, manipulating coordinate systems, and typesetting labels and numbers.

Uploaded by

mihaimiit
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 17

Drawing Graphs with MetaPost

John D. Hobby
Abstract
This paper describes a graph-drawing package that has been implemented as an extension to
the MetaPost graphics language. MetaPost has a powerful macro facility for implementing such
extensions. There are also some new language features that support the graph macros. Existing
features for generating and manipulating pictures allow the user to do things that would be
difficult to achieve in a stand-alone graph package.

Contents
1 Introduction

13

5 Conclusion

14

A Summary of the Graph Package


14
A.1 Graph Administration . . . . . . 15
A.2 Drawing and Labeling . . . . . . 15
A.3 Grids, Tick Marks, and Framing 15
A.4 Miscellaneous Commands . . . . 16
A.5 Arithmetic on Numeric Strings . 16
A.6 Internal Variables and Constants 16

2 Using the Graph Macros


2
2.1 Basic Graph-Drawing Commands 3
2.2 Coordinate Systems . . . . . . .
5
2.3 Explicit Grids and Framing . . .
8
2.4 Processing Data Files . . . . . . 10
3 Manipulating Big Numbers

4 Typesetting Numbers

11

Introduction

MetaPost is a batch-oriented graphics language based on Knuths METAFONT1 , but with PostScript2
output and numerous features for integrating text and graphics. The author has tried to make this
paper as independent as possible of the users manual [5], but fully appreciating all the material
requires some knowledge of the MetaPost language.
We concentrate on the mechanics of producing particular kinds of graphs because the question
of what type of graph is best in a given situation is covered elsewhere; e.g., Cleveland [2, 3, 4] and
Tufte [9]. The goal is to provide at least the power of UNIX3 grap [1], but within the MetaPost
language. Hence the package is implemented using MetaPosts powerful macro facility.
The graph macros provide the following functionality:
1. Automatic scaling
2. Automatic generation and labeling of tick marks or grid lines
3. Multiple coordinate systems
4. Linear and logarithmic scales
5. Separate data files
6. Ability to handle numbers outside the usual range
1 METAFONT

is a trademark of Addison Wesley Publishing Company.


is a registered trademark of Adobe Systems Inc.
3 UNIX is a registered trademark of UNIX System Laboratories, Inc.
2 PostScript

7. Arbitrary plotting symbols


8. Drawing, filling, and labeling commands for graphs
In addition to these items, the user also has access to all the features described in the MetaPost
users manual [5]. These include access to almost all the features of PostScript, ability to use and
manipulate typeset text, ability to solve linear equations, and data types for points, curves, pictures,
and coordinate transformations.
Section 2 describes the graph macros from a users perspective and presents several examples.
Sections 3 and 4 discuss auxiliary packages for manipulating and typesetting numbers and Section 5
gives some concluding remarks. Appendix A summarizes the graph-drawing macros.

Using the Graph Macros

A MetaPost input file that uses the graph macros should begin with
input graph
This reads a macro file graph.mp and defines the graph-drawing commands explained below. The
rest of the file should be one or more instances of
beginfig(figure number);
graphics commands endfig;
followed by end.
The following graphics commands suffice to generate the graph in Figure 1 from the data file
agepop91.d:
draw begingraph(3in,2in);
gdraw "agepop91.d";
endgraph;
(Each line of agepop91.d gives an age followed the estimated number of Americans of that age in
1991 [8].)

4106
3106
2106
106
0

20

40

60

80

Figure 1: A graph of the 1991 age distribution in the United States

2.1

Basic Graph-Drawing Commands

All graphs should begin with


begingraph(width,height);
and end with endgraph. This is syntactically a picture expression, so it should be preceded by
draw and followed by a semicolon as in the example.4 The width and height give the dimensions
of the graph itself without the axis labels.
The command
gdraw expression option list
draws a graph line. If the expression is of type string, it names a data file; otherwise it is a path
that gives the function to draw. The option list is zero or more drawing options
withpenpen expression | withcolorcolor expression | dashedpicture expression
that give the line width, color, or dash pattern as explained in the Users Manual [5].
In addition to the standard drawing options, the option list in a gdraw statement can contain
plot picture expression
The picture expression gives a plotting symbol to be drawn at each path knot. The plot option
suppresses line drawing so that5
gdraw "agepop91.d" plot btex $\bullet$ etex
generates only bullets as shown in Figure 2. (Following the plot option with a withpen option
would cause the line to reappear superimposed on the plotting symbols.)

4106

3106

2106
106
0

20

40

60

80

Figure 2: The 1991 age distribution plotted with bullets


Watch out for the following: the picture expression is placed with the lower-left corner at the
path knot, not its center. If you want it to be dead-center, you have to correct the placement
yourself. For the example above, you need something like this instead:
def MPbullet =
btex \lower\fontdimen22\cmsy \hbox to 0pt{\hss\cmsy\char15\hss} etex
enddef;
4 See

the Users Manual [5] for explanations of draw commands and syntactic elements like picture expression.
users should replace btex $\bullet$ etex with btex \(bu etex.

5 Troff

followed by:
gdraw "agepop91.d" plot MPbullet
The glabel and gdotlabel commands add labels to a graph. The syntax for glabel is
glabel. label suffix(string or picture expression, location) option list
where location identifies the location being labeled and label suffix tells how the label is offset
relative to that location. The gdotlabel command is identical, except it marks the location with
a dot. A label suffix is as in plain MetaPost: empty centers the label on the location; lft, rt,
top, bot offset the label horizontally or vertically; and ulft, urt, llft, lrt give diagonal offsets.
The location can be a pair of graph coordinates, a knot number on the last gdraw path, or the
special location OUT. Thus
gdotlabel.top(btex $(50,0)$ etex, 50,0)
would put a dot at graph coordinates (50,0) and place the typeset text (50, 0) above it. Alternatively,
glabel.ulft("Knot3", 3)
typesets the string "Knot3" and places it above and to the left of Knot 3 of the last gdraw path.
(The knot number 3 the paths time parameter [5, Section 8.2].)
The location OUT places a label relative to the whole graph. For example, replacing gdraw
"agepop91.d" with
glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
glabel.bot(btex Age in years etex, OUT);
gdraw "agepopm.d";
in the input for Figure 1 generates Figure 3. This improves the graph by adding axis labels and
using a new data file agepopm.d where the populations have been divided by one million to avoid
large numbers. We shall see later that simple transformations such as this can be achieved without
generating new data files.

4
3
Population
in millions

2
1
0

20

40
Age in years

60

80

Figure 3: An improved version of the 1991 age distribution graph


All flavors of TEX can handle multi-line labels via the \hbox within \vbox arrangement used
above, but LATEX users will find it more natural to use the tabular environment [7]. Troff users
4

can use nofill mode:

2.2

btex .nf
Population
in millions etex

Coordinate Systems

The graph macros automatically shift and rescale coordinates from data files, gdraw paths, and
glabel locations to fit the graph. Whether the range of coordinates is 0.64 to 4.6 or 640,000 to
4,600,000, they get scaled to fill about 88% of the height specified in the begingraph statement. Of
course line widths, labels, and plotting symbols are not rescaled.
The setrange command controls the shifting and rescaling process by specifying the minimum
and maximum graph coordinates:
setrange(coordinates, coordinates)
where
coordinates pair expression
| numeric or string expression,numeric or string expression
The first coordinates give (min , min ) and the second give (max , max ). The lines = min ,
= max , = min , and = max define the rectangular frame around the graph in Figures 13.
For example, an adding a statement
setrange(origin, whatever, whatever)
to the input for Figure 3 yields Figure 4. The first coordinates are given by the predefined pair
constant origin, and the other coordinates are left unspecified. Any unknown value would work as
well, but whatever is the standard MetaPost representation for an anonymous unknown value.
draw begingraph(3in,2in);
glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
glabel.bot(btex Age in years etex, OUT);
setrange(origin, whatever,whatever);
gdraw "agepopm.d";
endgraph;
4
3
Population
in millions 2
1
0
0

20

40
Age in years

60

80

Figure 4: The 1991 age distribution graph and the input that creates it.
5

Notice that the syntax for setrange allows coordinate values to be given as strings. Many
commands in the graph package allow this option. It is provided because the MetaPost language
uses fixed point numbers that must be less than 32768. This limitation is not as serious as it sounds
because good graph design dictates that coordinate values should be of reasonable magnitude [2, 9].
If you really want and to range from 0 to 1,000,000,
setrange(origin, "1e6", "1e6")
does the job. Any fixed or floating point representation is acceptable as long as the exponent is
introduced by the letter e.
Coordinate systems need not be linear. The setcoords command allows either or both axes to
have logarithmic spacing:
coordinate setting setcoords(coordinate type, coordinate type)
coordinate type log | linear | -log | -linear
A negative coordinate type makes (or ) run backwards so it is largest on the left side (or bottom)
of the graph.
Figure 5 graphs execution times for two matrix multiplication algorithms using
setcoords(log,log)
to specify logarithmic spacing on both axes. The data file matmul.d gives timings for both algorithms:
20
30
40
60
80
120
160
240
320
480

.007861
.022051
.050391
.15922
.4031
1.53
3.915
18.55
78.28
279.24

standard MM: size, seconds

20
30
40
60
80
120
160
240
320
480

.006611
.020820
.049219
.163281
.3975
1.3125
3.04
9.95
22.17
72.60

Strassen: size, seconds

A blank line in a data file ends a data set. Subsequent gdraw commands access additional data sets
by just naming the same data file again. Since each line gives one coordinate and one coordinate,
commentary material after the second data field on a line is ignored.
Placing a setcoords command between two gdraw commands graphs two functions in different
coordinate systems as shown in Figure 6. Whenever you give a setcoords command, the interpreter
examines what has been drawn, selects appropriate and ranges, and scales everything to fit.
Everything drawn afterward is in a new coordinate system that need not have anything in common
with the old coordinates unless setrange commands enforce similar coordinate ranges. For instance,
the two setrange commands force both coordinate systems to have ranging from 80 to 90 and
starting at 0.
When you use multiple coordinate systems, you have to specify where the axis labels go. The
default is to put tick marks on the bottom and the left side of the frame using the coordinate system
6

Standard

100
10
Seconds

Strassen

1
0.1
0.01
20

50
100
Matrix size

200

draw begingraph(2.3in,2in);
setcoords(log,log);
glabel.lft(btex Seconds etex,OUT);
glabel.bot(btex Matrix size etex,
OUT);
gdraw "matmul.d" dashed evenly;
glabel.ulft(btex Standard etex,8);
gdraw "matmul.d";
glabel.lrt(btex Strassen etex,7);
endgraph;

500

Figure 5: Timings for two matrix multiplication algorithms with the corresponding MetaPost input.

draw begingraph(6.5cm,4.5cm);
setrange(80,0, 90,whatever);
glabel.bot(btex Year etex, OUT);
glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of}
\hbox{metric tons} \hbox{(heavy line)}}etex, OUT);
gdraw "lead.d" withpen pencircle scaled 1.5pt;
autogrid(,otick.lft);
setcoords(linear,linear);
setrange(80,0, 90,whatever);
glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic}
\hbox{meter of air} \hbox{(thin line)}}etex, OUT);
gdraw "lead.d";
autogrid(otick.bot,otick.rt);
endgraph;
0.5
60

0.4

Emissions in
40
thousands of
metric tons
(heavy line) 20

0.3 Micrograms
per cubic
0.2 meter of air
(thin line)
0.1
0

0
80

82

84

Year

86

88

90

Figure 6: Annual lead emissions and average level at atmospheric monitoring stations in the United
States. The MetaPost input is shown above the graph.

in effect when the endgraph command is interpreted. Figure 6 uses the


autogrid(,otick.lft)
to label the left side of the graph with the coordinates in effect before the setcoords command.
This suppresses the default axis labels, so another autogrid command is needed to label the bottom
and right sides of the graph using the new coordinate system. The general syntax is
autogrid(axis label command, axis label command) option list
where
axis label command empty | grid or tick label suffix
grid or tick grid | itick | otick
The label suffix should be lft, rt, top, or bot.
The first argument to autogrid tells how to label the axis and the second argument does the
same for . An empty argument suppresses labeling for that axis. Otherwise, the label suffix
tells which side of the graph gets the numeric label. Be careful to use bot or top for the axis and
lft or rt for the axis. Use otick for outward tick marks, itick for inward tick marks, and grid
for grid lines. The option list tells how to draw the tick marks or grid lines. Grid lines tend to
be a little overpowering, so it is a good idea to give a withcolor option to make them light gray so
they do not make the graph too busy.

2.3

Explicit Grids and Framing

In case autogrid is not flexible enough, axis label commands generate grid lines or tick marks one
at a time. The syntax is
grid or tick.label suffix(label format, numeric or string expression) option list
where grid or tick and label suffix are as in autogrid, and label format is either a format string
like "%g" or a picture containing the typeset numeric label.
The axis label commands use a macro
format(format string, numeric or string expression)
to typeset numeric labels. Full details appear in Section 4, but when the format string is "%g",
it uses decimal notation unless the number is large enough or small enough to require scientific
notation.
The example in Figure 7 invokes
format("%g",y)
explicitly so that grid lines can be placed at transformed coordinates. It defines the transformation
newy() = /75 + ln and shows that this function increases almost linearly.6 This is a little like
using logarithmic -coordinates, except that is mapped to /75 + ln instead of just ln .
Figure 7 uses the command
frame.label suffix option list
to draw a special frame around the graph. In this case the label suffix is llft to draw just the
bottom and left sides of the frame. Suffixes lrt, ulft, and urt draw other combinations of two
sides; suffixes lft, rt, top, bot draw one side, and empty draws the whole frame. For example
frame dashed evenly
6 The

manual [5] explains how vardef defines functions and mlog computes logarithms.

vardef newy(expr y) = (256/75)*y + mlog y enddef;


draw begingraph(3in,2in);
glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
path p;
gdata("timepop.d", $, augment.p($1, newy(Scvnum $2)); );
gdraw p withpen nullpen;
for y=5,10,20,50,100,150,200,250:
grid.lft(format("%g",y), newy(y)) withcolor .85white;
endfor
autogrid(grid.bot,) withcolor .85white;
gdraw p;
frame.llft;
endgraph;
250
200
150
Population
in millions

100
50
20
10
5
1800

1850

1900

1950

2000

Figure 7: Population of the United States in millions versus time with the population re-expressed
as /75 + ln . The MetaPost input shown above the graph assumes a data file ttimepop.d that
gives (year, /75 + ln ) pairs.

draws all four sides with dashed lines. The default four-sided frame is drawn only when there is no
explicit frame command.
To label an axis as autogrid does but with the labels transformed somehow, use
auto.x

or auto.y

for positioning tick marks or grid lines. These macros produce comma-separated lists for use in for
loops. Any or values in these lists that cannot be represented accurately within MetaPosts
fixed-point number system are given as strings. A standard macro package that is loaded via
input sarith
defines arithmetic operators that work on numbers or strings. Binary operators Sadd, Ssub, Smul,
and Sdiv do addition, subtraction multiplication, and division.
One possible application is rescaling data. Figure 4 used a special data file agepopm.d that had
values divided by one million. This could be avoided by replacing gdraw "agepopm.d" by
gdraw "agepop91.d";
for u=auto.y: otick.lft(format("%g",u Sdiv "1e6"), u); endfor
autogrid(otick.bot,)

2.4

Processing Data Files

The most general tool for processing data files is the gdata command:
gdata(string expression, variable, commands)
It takes a file name, a variable , and a list of commands to be executed for each line of the data
file. The commands are executed with i set to the input line number and strings 1, 2, 3, . . . set
to the input fields on the current line. A null string marks the end of the array.
Using a glabel command inside of gdata generates a scatter plot as shown in Figure 8. The
data file countries.d begins
20.910 75.7 US
1.831 66.7 Alg
where the last field in each line gives the label to be plotted. Setting defaultfont in the first line
of input selects a small font for these labels. Without these labels, no gdata command would be
needed. Replacing the gdata command with
gdraw "countries.d" plot btex$\circ$etex
would change the abbreviated country names to open circles.
Both gdraw and gdata ignore an optional initial % on each input line, parse data fields separated
by white space, and stop if they encounter an input line with no data fields. Leading percent signs
make graph data look like MetaPost comments so that numeric data can be placed at the beginning
of a MetaPost input file.
It is often useful to construct one or more paths when reading a data file with gdata. The
augment command is designed for this:
augment.path variable(coordinates)
If the path variable does not have a known value, it becomes a path of length zero at the given
coordinates; otherwise a line segment to the given coordinates is appended to the path. The coordinates may be a pair expression or any combination of strings and numerics as explained at the
beginning of Section 2.2.
10

defaultfont:="cmr7";
draw begingraph(3in,2in);
glabel.lft(btex \vbox{\hbox{Life}\hbox{expectancy}} etex, OUT);
glabel.bot(btex Per capita G.N.P. (thousands of dollars) etex, OUT);
setcoords(log,linear);
gdata("countries.d", s,
glabel(s3, s1, s2);
)
endgraph;
80

70
Life
expectancy 60

50

Jap
Swi
Ita
Swe
Fra
Gre Spn Nth
Can
Aus
Bel
UK
Ger
US
Ven Por Tai
Chl
Yug Pol
BulCze
Mex
Rom
Hun
Sri
Col Arg
Chn
Tur
USS
SKo
Syr
NKo
Tha
Mal
Alg
Brz
Mor IrnPer
Phi
SAf
KenInn

Egy

Ind
Pak
Bur
ZaiGha
Ban
Sud
Mad
Tnz
Eth
Nep Uga
Nig
Moz

0.1 0.2
0.5 1
2
5 10 20
Per capita G.N.P. (thousands of dollars)
Figure 8: A scatter plot and the commands that generated it
If a file timepop.d gives , pairs, augment can be used like this to graph newy() versus :
path p;
gdata("timepop.d", s, augment.p(s1, newy(scantokens s2)); );
gdraw p;
(MetaPosts scantokens primitive interprets a string as if it were the contents of an input file. This
finds the numeric value of data field s2.)
Figure 9 shows how to use augment to read multiple column data and make multiple paths.
Paths p2, p3, p4, p5 give cumulative totals for columns 2 through 5 and pictures lab2 through lab5
give corresponding labels. The expression
image(unfill bbox lab[j]; draw lab[j])
executes the given drawing commands and returns the resulting picture: unfill bbox lab[j]
puts down a white background and draw lab[j] puts the label on the background. The gfill
command is just like gdraw, except it takes a cyclic path and fills the interior with a solid color. The
color is black unless a withcolor clause specifies another color. See the manual [5] for explanations
of for loops, arrays, colors, and path construction operators like --, cycle, and reverse.

Manipulating Big Numbers

MetaPost inherits a fixed-point number system from Knuths METAFONT [6]. Numbers are expressed
in multiples of 216 and they must have absolute value less than 32768. Knuth chose this system
because it is perfectly adequate for font design, and it guaranteed to give identical results on all types
11

draw begingraph(3in,2in);
glabel.lft(btex \vbox{\hbox{Quadrillions}\hbox{of BTU}} etex, OUT);
path p[];
numeric t;
gdata("energy.d", $,
t:=0; augment.p1($1,0);
for j=2 upto 5:
t:=t+scantokens $[j]; augment.p[j]($1,t);
endfor)
picture lab[];
lab2=btex coal etex; lab3=btex crude oil etex;
lab4=btex natural gas etex; lab5=btex hydroelectric etex;
for j=5 downto 2:
gfill p[j]--reverse p[j-1]--cycle withcolor .16j*white;
glabel.lft(image(unfill bbox lab[j]; draw lab[j]), .7+length p[j]);
endfor
endgraph;
hydroelectric

60

natural gas

40
Quadrillions
of BTU

crude oil

20

coal

0
1900

1920

1940

1960

Figure 9: A graph of U.S. annual energy production and the commands that generated it

12

of computers. Fixed-point numbers are seldom a problem in MetaPost because all computations are
based on coordinates that are limited by the size the paper on which the output is to be printed. This
does not hold for the input data in a graph-drawing application. Although graphs look best when
coordinate axes are labeled with numbers of reasonable magnitude, the strict limits of fixed-point
arithmetic would be inconvenient.
A simple way to handle large numbers is to include the line
input sarith
and then use binary operators Sadd, Ssub, Smul, and Sdiv in place of +, -, *, and /. These operators
are inefficient but very flexible. They accept numbers or strings and return strings in exponential
notation with the exponent marked by e; e.g., "6.7e-11" means 6.7 1011 .
The unary operator7
Sabs string
finds a string the represents the absolute value. Binary operators Sleq and Sneq perform numeric
comparisons on strings and return boolean results.
The operation
Scvnum string
finds the numeric value for a string if this can be done without overflowing MetaPosts fixed-point
number system. If the string does not contain e, it is much more efficient to use the primitive
operation
scantokens string
The above operators are based on a low-level package that manipulates numbers in Mlog form.
A number in Mlog form represents
2

16

where = 2

24

Any value between 1.61 1028 and 3.88 1055 can be represented this way. (There is a constant
Mten such that * Mten represents 10 for any integer in the interval [29, 55].)
The main reason for mentioning Mlog form is that it allows graph data to be manipulated as a
MetaPost path. The function
Mreadpath(file name)
reads a data file and returns a path where all the coordinates are in Mlog form. An internal variable
Gpaths determines whether gdraw and gfill expect paths to be given in Mlog form. For example,
this graphs the data in agepop91.d with coordinates divided by one million:
interim Gpaths:=log;
gdraw Mreadpath("agepop91.d") shifted (0,-6*Mten);

Typesetting Numbers

The graph package needs to compute axis labels and then typeset them. The macro
format(string expression, numeric or string expression)
does this. You must first input graph or input format to load the macro file. The macro takes a
format string and a number to typeset and returns a picture containing the typeset result. Thus
format("%g",2+2) yields 4
and
format("%3g","6.022e23")

yields 6.021023

A format string consists of


7 The

argument to a unary operator need not be parenthesized unless it is an expression involving binary operators.

13

an optional initial string not containing a percent sign,


a percent sign,
an optional numeric precision ,
one of the conversion letters e, f, g, G,
an optional final string .
The initial and final strings are typeset in the default font (usually cmr10), and the typeset number
is placed between them. For the e and g formats, the precision is the number of significant digits
allowed after rounding; for f and G, the number is rounded to the nearest multiple of 10 . If the
precision is not specified, the default is = 3. The e format always uses scientific notation and the
f format uses ordinary decimal notation but reverts to scientific notation if the number is at least
10000. The g and G formats also revert to scientific notation for non-zero numbers of magnitude less
than 0.001.
The format macro needs a set of templates to determine what font to use, how to position the
exponent, etc. The templates are normally initialized automatically, but it is possible to set them
explicitly by passing five picture expressions to init_numbers. For instance, the default definition
for TEX users is
init_numbers(btex$-$etex, btex$1$etex, btex${\times}10$etex,
btex${}^-$etex, btex${}^2$etex)
The first argument tells how to typeset a leading minus sign; the second argument is an example of
a 1-digit mantissa; third comes whatever to put after the mantissa in scientific notation; next come
a leading minus sign for the exponent and a sample 1-digit exponent.
Picture variable Fe_plus gives a leading plus sign for positive numbers, and Fe_base gives
whatever should precede the exponent when typesetting a power of ten. Calling init_numbers
initializes Fe_plus to an empty picture and constructs Fe_base from its second and third arguments.

Conclusion

The graph package makes it convenient to generate graphs from within the MetaPost language. The
primary benefits are the power of the MetaPost language and its ability to interact with TEX or troff
for typesetting labels. Typeset labels can be stored in picture variables and manipulated in various
ways such measuring the bounding box and providing a white background.
We have seen how to generate shaded regions and control line width, color, and styles of dashed
lines. Numerous other variations are possible. The full MetaPost language [5] provides many other
potentially useful features. It also has enough computing power to be useful for generating and
processing data.

Summary of the Graph Package

In the following descriptions, italic letters such as and denote expression parameters and words
in angle brackets denote other syntactic elements. Unless specified otherwise, expression parameters
can be either numerics or strings. An option list is a list of drawing options such as withcolor
.5white or dashed evenly; a label suffix is one of lft, rt, top, bot, ulft, urt, llft, lrt.

14

A.1

Graph Administration

begingraph(,) Begin a new graph with the frame width and height given by numeric parameters
and .
endgraph End a graph and return the resulting picture.
setcoords( , ) Set up a new coordinate system as specified by numeric flags , . Flag values
are linear and log.
setrange(coordinates, coordinates) Set the lower and upper limits for the current coordinate
system. Each coordinates can be a single pair expression or two numeric or string expressions.

A.2

Drawing and Labeling

All of the drawing and labeling commands can be followed by an option list. In addition to the
usual MetaPost drawing options, the list can contain a plot picture clause to plot a specified
picture at each data point.
The drawing and labeling commands are closely related to a set of similarly named commands
in plain MetaPost. The gdrawarrow and gdrawdblarrow commands are included to maintain this
relationship.
gdotlabel.label suffix(, location) This is like glabel except it also puts a dot at the location
being labeled.
gdraw Draw path , or if is a string, read coordinate pairs from file and draw a polygonal line
through them.
gdrawarrow This is like dgraw except it adds an arrowhead at the end of the path.
gdrawdblarrow This is like dgraw except it adds an arrowheads at each end of the path.
gfill Fill cyclic path or read coordinates from the file named by string and fill the resulting
polygonal outline.
glabel.label suffix(, location) If is not a picture, it should be a string. Typeset it using
defaultfont, then place it near the given location and offset as specified by the label suffix.
The location can be and coordinates, a pair giving and , a numerc value giving a time
on the last path drawn, or OUT to label the outside of the graph.

A.3

Grids, Tick Marks, and Framing

auto.x or y Generate default or coordinates for tick marks.


autogrid(axis label command, axis label command) Draw default axis labels using the specified commands for the and axes. An axis label command may be empty or it may be
itick, otick, or grid followed by a label suffix.
frame.label suffix option list Draw a frame around the graph, or draw the part of the frame
specified by the label suffix.
grid.label suffix( ,) Draw a grid line across the graph from the side specified by the label
suffix, and label it there using format string and coordinate value . If is a picture, it
gives the label.
itick.label suffix( ,) This is like grid except it draws an inward tick mark.
otick.label suffix( ,) This is like grid except it draws an outward tick mark.
15

A.4

Miscellaneous Commands

augment.variable(coordinates) Append coordinates to the path stored in variable.


format( , ) Typeset according to format string and return the resulting picture.
gdata( , variable, commands) Read the file named by string and execute commands for
each input line using the variable as an array to store data fields.
init_numbers(, , , , ) Provide five pictures as templates for future format operations: is
a leading minus; is a sample mantissa; follows the mantissa; is a leading minus for the
exponent .
Mreadpath( ) Read a path for the data file named by string and return it in Mlog form.

A.5

Arithmetic on Numeric Strings

It is necessary to input sarith before using the following macros:


Sabs Compute || and return a numeric string.
Sadd Compute + and return a numeric string.
Scvnum Return the numeric value for string .
Sdiv Compute / and return a numeric string.
Sleq Return the boolean result of the comparison .
Smul Compute * and return a numeric string.
Sneq Return the boolean result of the comparison = .
Ssub Compute and return a numeric string.

A.6

Internal Variables and Constants

Autoform Format string used by autogrid. Default: "%g".


Fe_base What precedes the exponent when typesetting a power of ten.
Fe_plus Picture of the leading plus sign for positive exponents.
Gmarks Minimum number of tick marks per axis for auto and autogrid. Default: 4.
Gminlog Minimum largest/smallest ratio for logarithmic spacing with auto and autogrid. Default:
3.0.
Gpaths Code for coordinates used in gdraw and gfill paths: linear for standard form, log for
Mlog form.
Mten The Mlog form for 10.0

16

References
[1] Jon L. Bentley and Brian W. Kernighan. Grapa language for typesetting graphs. In Unix
Research System Papers, volume II, pages 109146. AT&T Bell Laboratories, Murray Hill, New
Jersey, tenth edition, 1990.
[2] William S. Cleveland. The Elements of Graphing Data. Hobart Press, Summit, New Jersey,
1985, revised 1994.
[3] William S. Cleveland. Visualizing Data. Hobart Press, Summit, New Jersey, 1993.
[4] William S. Cleveland. A model for studying display methods of statistical graphics (with discussion). Journal of Computational and Statistical Graphics, 3, to appear.
[5] John D. Hobby. A users manual for MetaPost. Computing Science Technical Report no. 162,
AT&T Bell Laboratories, Murray Hill, New Jersey, April 1992. Available as http://cm.belllabs.com/cs/cstr/162.ps.gz.
[6] Donald E. Knuth. METAFONT the Program. Addison Wesley, Reading, Massachusetts, 1986.
Volume D of Computers and Typesetting.
[7] Leslie Lamport. LATEX: A Document Preparation System. Addison Wesley, Reading, Massachusetts, 1986.
[8] U.S. Bureau of the Census. Statistical Abstracts of the United States: 1992. Washington, D.C.,
112th edition, 1992.
[9] Edward R. Tufte. Visual Display of Quantitative Information. Graphics Press, Box 430, Cheshire,
Connecticut 06410, 1983.

17

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy