Professional Documents
Culture Documents
2011/2012
Sebastian Rost
This is a brief tutorial to get you started with using the freeware Generic Mapping Tools (GMT).
Essentially GMT is a bunch of programs, that may be used one after another to append plots, add
more features, lines, data sets etc. We will use basic C-shells commands on a linux system, so files
that contain the commands we normally type. This tutorial is partly based on a course by Ed
Garnero from Arizona State University.
Setup
To run GMT on the School's computer system you probably have to add the correct search path to
your C-shell resource file.
Please check if your ~/.cshrc file contains the following line:
# for GMT4.1
set path = ( $path /nfs/see-fs-01_app1/GMT4.1/bin )
You can do this by opening this by opening this file using your favourite editor. E.g.:
nedit ~/.cshrc
If you made any changes to your ~/.cshrc file you have to reread it, so that the computer knows
about the changes. This takes only affect in the current konsole where you type the source
command.
source ~/.cshrc
If you now type a GMT command (e.g. psxy) you should get a help page that tells you how the
command works.
GMT manual and online resources
Here are some links related to GMT.
GMT's home page, from the author's of GMT, Generic Mapping Tools, by Wessel and Smith from
the University of Hawaii. Also download your own version here:
http://gmt.soest.hawaii.edu/
A former PhD student at Harvard has made an interactive version of GMT: Interactive Generic
Mapping Tools (iGMT). I am not working with this version and will not talk about it today, but it
might be an easy way to make simple maps quickly. GMT is more powerful than the interactive
version.
http://www.seismology.harvard.edu/~becker/igmt/
There are also extensive manual pages installed with GMT. You can access them by typing:
man gmtcommand
E.g.:
(earsro-see-gw-01.leeds.ac.uk)39% man psxy
Let's first start with a file named map_basic.csh. It creates a world map. The main contents of that file
(minus comment lines) follows :
#!/bin/csh
pscoast -R-180/180/-70/70 -JM0/14/7 -Ba60g30f15/a30g30f15WSen \
-X0.5 -Y2.0 -Dc -S100/100/200 -G100/205/100 -W1/0/255/0 \
-P -K >! map1.ps
awk '{print $7,$6}' < data/world_EQ.dat >! eq.xy
psxy eq.xy -R -JM -Sc0.075i -G255/0/0 -W2 -O >> map1.ps
gs -sDEVICE=x11 map1.ps
The first line is used to let the computer know that there is a C-shell script coming and that is
should use the C-shell to interpret the commands. There are two GMT programs that are used in
this script pscoast and psxy. The other two programs, awk and gs are UNIX commands to read
certain parameters from a file (awk) and to display a postscript file (gs).
This script will draw a map (pscoast) and plots global seismicity (stored in the file
data/world_EQ.dat) as circles on this map (psxy). The command awk read only the latitude and
longitude of these earthquakes from the file.
The general GMT command structure is:
gmt_command (options) > outputfile
There are many, many options which is the real power of GMT. The first command (pscoast) is
used to plot the main coastlines on a map and contains the most important options:
-Rwest/east/south/north
-Jparameters
-Btickinfo
-X
-Y
-Dresolution
-Sfill
-Gfill
-Wpen
-P
-O
-K
Let's play with this script. Open it in a text editor (e.g. vi or nedit).
You can change the area of interest by changing the west/east/south/north boundaries of the -R
parameter. Let's focus on Europe for a while. In the text editor change the area of interest to:
-R-15/20/30/65
and rerun the script (by typing the script name into the command line). You should now have a map
of Europe with very few earthquakes on it.
You will notice that the map looks slightly funny and that the map ticks marks are not really useful,
since there are too few. So let's change this:
Change the tick marks in pscoast to:
-Ba10g5f5/a10g5f5
Adding lines
You can add lines to this map using the same command psxy that is used to plot the points onto the
map. To draw a line you have to omit the symbol declaration -S of the command psxy.
You can add the lines by adding the following line to your code (see map_line.csh):
psxy -R -JM -Sc0.15i -G255/0/0 -W3/255/255/0 -L -O -K << END >> $outfile
-12.0 49.0
3.0 49.0
3.0 59.0
-12.0 59.0
END
This will draw a yellow rectangle around Great Britain and Ireland. You will note that the line,
although they should be straight show a slight curvature. This is due to the map projection, so the
process of getting something from a sphere to a plane map.
You can imagine that adding a large amount of line segments to the GMT script in this way is a bit
awkward. So alternatively you could write this line as:
psxy lines.dat -R -JM -Sc0.15i -G255/0/0 -W3/255/255/0 \
-L -O -K << END >> $outfile
Which opens the file lines.dat, which e.g. contains the line segments as:
-12.0
3.0
3.0
-12.0
49.0
49.0
59.0
59.0
Every line segments is in one line. So this plots a line from -12/49 to 3/49, then a line from 3/49 to
3/59, then one from 3/59 to -12/59. Since we added the option -L to the psxy command this polygon
will be closed (-L forces polygon to close). If you want different line segments that are not
connected (e.g. source-receiver great circle paths) you have to specify -M in psxy and have to
separate the segments:
>>
-12.0
3.0
>>
3.0
-12.0
>>
49.0
49.0
59.0
59.0
There are 3 lines of text instruction, and they are of the format:
x y s a f j text string
where
x = x location of the text string
y = y location of the text string
s = size of text in points
a = angle of text, in degrees counter clock wise
f = font number (type in a terminal window "pstext -L" to see the font options)
j = justification (BL = bottom left, TR= top right, CM=center middle, etc)
text string = the text to be displayed.
Adding more information
It is easy to add more information to these plots. E.g. you might be interested in the source depth of
the earthquakes we plotted in the beginning. This information is actually contained in the data file
we read in the beginning. So how do we get it out of the file and into the plot.
The best way to visualize this is by color-coding the depth. So an event with a different depth will
have a different color.
To do this we need a colorscale first. The program that produces color scales is makecpt. To create
a color scale for the earthquake depths from 0 to 700 km with a 50 km tick mark spacing of the
color and a continuous colorscale (-Z) using the prepared rainbow colorscale (to see other preprepared colorscale type makecpt) you add (script map_depth.csh):
makecpt -Crainbow -T0/700/50 -Z >! color.cpt
The color scale will be written to the file color.cpt and can then be used to color the depth of the
earthquakes:
awk '{print $7,$6,$8}' < data/world_EQ.dat >! eq.xy
psxy eq.xy -R -JM -Sc0.075i -Ccolor.cpt -W2 -O >> map1.ps
The awk command write the depth in the third column of eq.xy. psxy then reads the data
(lat,lon,dep) from eq.xy and uses the colofile color.cpt to add the depth information as color.
Multiple Plots
You might want to plot an overview map of your study are and a more detailed map including
sample point or whatever. To do this you need several plots in one page.
Let's draw a globe on the left had side of a page (using a new map projection). Check out the script
globe1.csh:
#! /bin/csh
set output = globe.ps
#----------------------------------------------------------------------# run the GMT program "pscoast" to make coastlines, and do it on a globe
# and let's center it on lat=-10.5 lon=-81 deg, and the size: R=1.0 inch.
#----------------------------------------------------------------------pscoast -R0/360/-90/90 -Jg-80/-10/0.7/0 -G60/210/160 \
-S225/250/225 -Dc -Bg30 -W3/0/0/0 -Y8.0 -P >! $output
#----------------------------------------------------------------------# run ghostscript to plot our postscript output file
#----------------------------------------------------------------------gs -sDEVICE=x11 $output
Again if you want to add something later to this plot you'll need to add a -K to the last previous
postscript generating command. You can add as many things to the plot as you like, but all of the
lines (except the last one needs a -K). If you have a -K on the last postscript producing command,
you will be able to look at the ps-file, but it will not print!!!
Let's add a box around a specific region on our little globe (globe2.csh). Copy the following into
the globe1.csh file using the text editor, right before the last 4 lines that plot the result:
#----------------------------------------------------------------------# run the GMT program "psxy" that will add a box around some region
# NOTE: we have added a "-:" flag in psxy below. This corresponds to
# input where X and Y values are in opposite columns (e.g, Lat,Lon
# instead of Lon,Lat)
#----------------------------------------------------------------------psxy -R -Jg -: -W6/0/0/0 -O << END >> $output
20 -100
20 -60
-10 -60
-10 -100
20 -100
END
For
this to work, we have to now modify that last previous postscript-making command (the pscoast
command). We have to add a -K so that our postscript output is aware of follow up plotting tasks.
Now let's add a cartesian projection plot with this box we just made as the bounds of an additional
plot (globe3.csh), on the same page. We shift this plot by 2 inches in the x direaction (-X2.0) and -2
in the Y direction (-Y-2.0) to move it away from the previous plot. Since we give a new projection
and a new area, it will plot a new plot. The output still goes to the same output file:
Contouring in GMT
GMT has several tools to work with gridded datasets. It uses a special format to read in gridded
data, but it can also read in standard xyz data. The main programs to use wit a gridded (spatial) data
are:
grdcontour
grdview
grd2xyz
xyz2grd
grd2cpt
grdvector
grdimage
There are more examples to calculate gradient, filter gridded data and work with grid files. For
more information check the GMT webapge!
The first example is similar to example 1 on the GMT webpage and plots contour lines of the global
geoid. It uses the gridded dataset in the file osu91a1f_16.grd
Here is the example (also in the file countour1.csh):
#!/bin/csh
# FILE: c.contour0
# Purpose: Make a contour map based on the data in the file osu91a1f_16.grd
# GMT progs: pscoast, grdcontour
#
# this is a stripped down version of the GMT example 1 on the web
# define the output filename
set outfile = contour0.ps
# plot the coast, color the land (-G) w/ light gray
pscoast -R-180/180/-90/90 -JH0/6i -X1.25i -Y5.5i -Bg30 \
-Dc -G200 -P -K >!$outfile
# contour the geoid data set. The -C flag is for contour interval
grdcontour data/osu91a1f_16.grd -R -JH -C10 -O >> $outfile
# plot the output file
gs -sDEVICE=x11 $outfile
You see we used the known pscoast to command to plot the coastlines. On top of the coastline map
7
we plot the contour lines of the geoid. The -C flag is used to define the contour interval.
In this plot it is very complicated to see the value for the contour lines. Therefore let's annotate the
contour lines by changing the grdcontour command:
grdcontour -R osu91a1f_16.grd -JH -C10 -A30f12 -G4i -O >> $outfile
The flag -A annotates the contour lines and -G hardwires the annotation spacing.
To make this figure more readable it would be good to use some color for the gridlines. Let's say we
plot negative values as red and positive values as blue. We will use grdcontour twice and limit the
contour range. The script then looks something like this (countour2.csh):
#!/bin/csh
# FILE: contour2.csh
# Purpose: Make COLORED contour map based on data in the file osu91a1f_16.grd
# PLOT 2 COLORS: one for + one for # GMT progs: pscoast, grdcontour
#
# define the output filename
set outfile = contour2.ps
# plot the coast, this time in color the land (-G)
pscoast -R-180/180/-90/90 -JH0/6i -X1.25i -Y5.5i -K -Bg30 -Dc \
-G200/255/200 -S200/200/255 -P >! $outfile
# contour the geoid data set. The -C flag is for contour interval
# annotate the contour (-A) and hardwire annotation spacings (-G)
# additionally: use grdcontour twice: one for red and one for blue lines (-W)
# limit contour range of each statement, so we only plot minus values for red
lines,
# plus geoid values for blue lines (-L)
grdcontour -R data/osu91a1f_16.grd -JH -C10 -A50f12 -G4i -L-1000/-1 \
-W1/255/0/0 -O -K >> $outfile
grdcontour -R data/osu91a1f_16.grd -JH -C10 -A50f12 -G4i -L-1/1000 \
-W1/0/0/255 -O >> $outfile
# plot the output file
gs $outfile
If you want to make the contours even clearer you can add another line for the zero geoid values.
This is done by another grdcontour call with a very small range of contours.
grdcontour data/osu91a1f_16.grd -R -JH -C15 -A30f12 -G3i -L-1/1 -W5/0/0/0 \
-T -O -K >> $outfile
It is important to remember that GMT plots things on top of each other. So if you call the pscoast
before the grdimage the coastlines will be covered with the geoid values. The grd2cpt works
similar to the makecpt we had before. In this case we use a colorscale (polar) that runs from blue
over white to red.