Scatter plots with Basemap and Matplotlib

A while back I used the flickr api to map 24 hours worth of geotagged photos.
My previous attempts needed some manual Photoshop work to superimpose the plots on a map. The next logical step is to do the whole process – from start to finish – in code, and remove the manual steps.
To do this, I tried the awesome Basemap toolkit. This library allows all sorts of cartographic projections…
Installing Basemap
Basemap is an extention available with Matplotlib. You can download it here (under matplotlib-toolkits)
I installed the version for Python 2.5 on Windows; this missed out a dependency to httplib2 which I needed to install separately from here.
Getting started
Let’s assume you have 3 arrays – x, y and z. These contain the longitudes, latitudes, and data values at each point. In this case, I binned the geotagged photos into a grid of degree points (360×180), so that each degree square contained the number of photos tagged in that degree square.
Setting up
from basemap import Basemap import matplotlib.pyplot as plt import numpy as np import string import matplotlib.cm as cm x=[] y=[] z=[]
Now, you need to populate the x,y and z arrays with values. I’ll leave that an exercise to you
All three arrays need to be the same length.
Now, you need to decide which projection to use. Here, I’ve used the Orthographic projection.
m = Basemap(projection='ortho',lon_0=-50,lat_0=60,resolution='l')
Here is the secret sauce I took a while to work out. That’ll teach me not to R the FM. This line transforms all the lat, lon coordinates into the appropriate projection.
x1,y1=m(x,y)
The next bit, you can decide which bits you want to plot – land masses, country boundaries etc.
m.drawmapboundary(fill_color='black') # fill to edge m.drawcountries() m.fillcontinents(color='white',lake_color='black',zorder=0)
Finally, the scatter plot.
m.scatter(x1,y1,s=sizes,c=cols,marker="o",cmap=cm.cool,alpha=0.7)
plt.title("Flickr Geotagging Counts with Basemap")
plt.show()





