Click here to see the SAS code (50,000-mile view)
Click here to see the example.
Click here to see the SAS code (zoomed-in view)

-----

See my blog for more information!

See my blog for more information about this graph!


Charles Minard is a famous map-creator from the late 1800's.
Perhaps his most famous map is the following showing 
Napoleon's March on Moscow in 1812.

I looked at several other people's version of Minard's map 
on the following webpage and devised an idea for my own 
version, using SAS/Graph's "proc gmap".

I used longitude/latitude, troop number, and city data from the following webpage
in combination with the temperature data from the following translation of Minard's Map.

I'm somewhat "geographically challenged" when it comes to europe, especially
with the city names on the Minard map (and I'm probalby not alone?)  
Therefore I decided to plot Napoleon's path on *modern* maps, with the
country names labeled.  Also, I wanted to give a "50,000-mile" view of
the map, so people could see where this area was in relation to other
areas of europe (such as France).

*****************************************************************
*
*  Here's my 50,000-mile map.
*
*  Which drills-down to this Zoomed-in map.
*
*****************************************************************

Here are some details about how I created my map(s) in SAS/Graph...

For both of these maps, I used a combination of the sas maps.europe 
and maps.asia as the base map.  I created custom/subsetted/clipped
versions of these maps using SAS' "proc gproject", and specifying
the latmax/latmin/longmax/longmin for the area I wanted in my map.

To get the blue ocean/sea water to appear only in the map area I use
an annotated rectangular polygon with corners at the exact same
long/lat coordinates as the corners of my map, and annotate it 
'behind' the map.  (If I had used "goptions cback=blue" that would
have filled the entire background of the page with blue, not just
the wanter area in the map.)

In the 50,000-mile map, I annotate country names at long/lat
positions of my choosing, and I annotate a dashed-line box around
the area that will be shown for the drilldown.  In this dashed-box
area, I use annotate's "html" variable to encode a drilldown, so 
that when you click inside this rectangle it drills-down to the 
zoomed-in map.  I also annotate a dot at the city locations (and
I annotate city labels in the zoomed-in map).

I use the same technique in both maps to show Napoleon's path.
I take the long/lat values, and use them as vertices for a line,
and connect the dots with line segments (using annotate move/draw
functions).  The size/width of the line is calculated based on the 
number of troops (ie, men) still alive during that leg of the trip.
One problem with this technique was that it produced big/jagged
gaps/transitions at the line vertices (especially where the lines
changed directions sharply).  To smoothe this out, I annotated a 
'pie' (filled circle) at each vertex, with the diameter of the 
pie being the same as the width of the line.  With this annotation
(as with most all of the lat/long-based annotation in this map)
I combine the annotation with the map, use "proc gproject" to do
the map projection, and then separate the annotate from the map
(this guarantees that things line up in the correct position).

On the zoomed-in map, notice that when you hover your mouse over the 
city names, you see the city name (and additional info, if available)
for that city.  If you click on the city names, that launches a 
google search for information about that city (including the words
'Napoleon' and '1812' in the search).

When you hover your mouse over the vertex points of Napoleon's path,
you'll get a html charttip/flyover-text showing the number of troops
at that point during the march.  At first I made these hotspots the
exact same size as the visual vertex dots, but the small ones were 
too small -- therfore I annotate a larger dot 'behind' the map for 
each vertex, and the charttip is based on the size of those 'invisible'
vertex points :)

Surprisingly the toughest part of the map was the temperature plot.
After trying a few different approaches, I decided to base the position
of the temperature dots and the axes & gridlines & labels all using 
long/lat coordinates.  The distance from the minimum gridline to the
maximum gridline is 1 degree of latitude (not to be confused with 
degrees celcius or degrees farenheit! ;).  And for the horizontal 
positions, I use he position of the cities/battles corresponding to
the temperatures.  I color the temperature dots an 'ice cold' light
blue, since they represent cold temperatures.

/* Written by Robert Allison (Robert.Allison@sas.com) */

Back to Samples Index