import pandas as pd data = pd.DataFrame.from_csv('F1-circuits.csv', header=0, sep=';', index_col=None, parse_dates=False, encoding='latin-1') data.head(5) import requests _GEOCODE_QUERY_URL = 'http://maps.googleapis.com/maps/api/geocode/json' def geocode(address, sensor='false'): """ Given a string 'address', return a dictionary of information about that location, including its latitude and longitude. """ params = dict(address=address, sensor=sensor) response = requests.get(url=_GEOCODE_QUERY_URL, params=params) return response.json() def address_to_latlng(address): """ Given a string 'address', return a '(latitude, longitude)' pair. """ location = geocode(address)['results'][0]['geometry']['location'] return tuple(location.values()) from mpl_toolkits.basemap import Basemap, shiftgrid import numpy as np import matplotlib.pyplot as plt %matplotlib inline def basic_world_map(ax=None, region='world'): if region=='world': m = Basemap(resolution='i',projection='eck4', lat_0=0,lon_0=0) # draw parallels and meridians. m.drawparallels(np.arange(-90.,91.,30.)) m.drawmeridians(np.arange(-180.,181.,30.)) elif region=='europe': m = Basemap(width=4000000,height=4000000, resolution='l',projection='aea',\ lat_1=40.,lat_2=60,lon_0=10,lat_0=50) # draw parallels and meridians. m.drawparallels(np.arange(-90.,91.,10.)) m.drawmeridians(np.arange(-180.,181.,10.)) m.shadedrelief(scale=0.5) m.drawcoastlines() m.drawcountries() m.fillcontinents(color='coral', alpha=0.3) return m maximum = data['Grands Prix held'].max() minimum = data['Grands Prix held'].min() f, ax = plt.subplots(figsize=(20, 8)) ax.set_title('Formula 1 Grand Prix Circuits since 1950\n(Radius by number of races held)') m = basic_world_map(ax) for cir, loc, num in zip(data['Circuit'].values, data['Location'].values, data['Grands Prix held'].values): lat, lng = address_to_latlng(cir + ', ' + loc) x, y = m(lat, lng) m.scatter(x, y, s=np.pi * (3 + (num-minimum)/(maximum-minimum)*17)**2, marker='o', c='red', alpha=0.7) ax.annotate(u'\N{COPYRIGHT SIGN} 2014, Pablo Fernandez', (0, 0)) f.savefig('f1-circuits.png', dpi=72, transparent=False, bbox_inches='tight') f, ax = plt.subplots(figsize=(20, 8)) ax.set_title('Formula 1 Grand Prix Circuits in Europe since 1950\n(Radius by number of races held)') m = basic_world_map(ax, 'europe') for cir, loc, num in zip(data['Circuit'].values, data['Location'].values, data['Grands Prix held'].values): lat, lng = address_to_latlng(cir + ', ' + loc) x, y = m(lat, lng) m.scatter(x, y, s=np.pi * (3 + (num-minimum)/(maximum-minimum)*17)**2, marker='o', c='red', alpha=0.7) ax.annotate(u'\N{COPYRIGHT SIGN} 2014, Pablo Fernandez', (100000, 100000)) f.savefig('f1-circuits-europe.png', dpi=72, transparent=False, bbox_inches='tight')