import numpy as np
data = np.loadtxt('path-tracks.csv',dtype=np.str,delimiter=',',skiprows=1)
print data
[['19.70' '-95.20' '2/5/04 6:45 AM' '1' '-38' 'CCM']
['19.70' '-94.70' '2/5/04 7:45 AM' '1' '-48' 'CCM']
['19.30' '-93.90' '2/5/04 8:45 AM' '1' '-60' 'CCM']
['19.00' '-93.50' '2/5/04 9:45 AM' '1' '-58' 'CCM']
['19.00' '-92.80' '2/5/04 10:45 AM' '1' '-50' 'CCM']
['19.20' '-92.60' '2/5/04 11:45 AM' '1' '-40' 'CCM']
['19.90' '-93.00' '2/5/04 12:45 PM' '1' '-43' 'CCM']
['20.00' '-92.80' '2/5/04 1:15 PM' '1' '-32' 'CCM']
['23.10' '-100.20' '30/5/04 4:45 AM' '2' '-45' 'SCME']
['23.20' '-100.00' '30/5/04 5:45 AM' '2' '-56' 'SCME']
['23.30' '-100.00' '30/5/04 6:45 AM' '2' '-48' 'SCME']
['23.30' '-100.20' '30/5/04 7:45 AM' '2' '-32' 'SCME']
['23.40' '-99.00' '31/5/04 3:15 AM' '3' '-36' 'SCM']
['23.50' '-98.90' '31/5/04 4:15 AM' '3' '-46' 'SCM']
['23.60' '-98.70' '31/5/04 5:15 AM' '3' '-68' 'SCM']
['23.70' '-98.80' '31/5/04 6:15 AM' '3' '-30' 'SCM']]
with the above code I get an array whose columns represent: [Lat, Lon, Date, Identifier, Temperatures, Category]. Now, I will put a code that allows me to plot the first and second column on the map of Mexico:
#!/usr/bin/python
#Project Storm: Plot trajectories of convective systems
#import libraries
import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as pl
# Plot a map for Mexico
m = Basemap(projection='cyl', llcrnrlat=12, urcrnrlat=35,llcrnrlon=-120, urcrnrlon=-80, resolution='c', area_thresh=1000.)
m.bluemarble()
m.drawcoastlines(linewidth=0.5)
m.drawcountries(linewidth=0.5)
m.drawstates(linewidth=0.5)
#Draw parallels and meridians
m.drawparallels(np.arange(10.,35.,5.))
m.drawmeridians(np.arange(-120.,-80.,10.))
m.drawmapboundary(fill_color='aqua')
#Open file whit numpy
data = np.loadtxt('path-tracks.csv', dtype=np.str,delimiter=',', skiprows=1)
latitude = data[:,0]
longitude = data[:,1]
#Convert latitude and longitude to coordinates X and Y
x, y = m(longitude, latitude)
#Plot the points on the map
pl.plot(x,y,'ro-')
pl.show()
The points plotted on the map, corresponding to three different paths. Mi final idea is to draw a line connecting the points associated with each path, How I can do this?
is posible draw an identifier or a mark for each path?
how I can set the size of the figure so that it can distinguish the separation between the points?
The size of the figure can be set by simply creating a figure
before calling Basemap
. I have used Pandas to read the CSV because it allows easy grouping (per path). If you dont want to use Pandas you probably can get the same result by iterating over np.unique('cat')
or something. If you use the datetime
as the index in pandas your points automatically get sorted by time in the case your CSV is unsorted.
I'm not sure what you mean by drawing an identifier. The legend makes it possible to distinguish between paths but you could also plot the 'Cat'
on the map at the beginning or end of a line for example.
Your map properties make it a bit 'zoomed out' for such small paths. Using ax = pl.gca()
and ax.set_xlim()
allows you to set a boundingbox in the mapcoordinates. Which you can derive from the max and min coordinates in your paths + some buffer.
import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as pl
import pandas as pd
fig = plt.figure(figsize=(12,12))
# Plot a map for Mexico
m = Basemap(projection='cyl', llcrnrlat=12, urcrnrlat=35,llcrnrlon=-120, urcrnrlon=-80, resolution='c', area_thresh=1000.)
m.bluemarble()
m.drawcoastlines(linewidth=0.5)
m.drawcountries(linewidth=0.5)
m.drawstates(linewidth=0.5)
#Draw parallels and meridians
m.drawparallels(np.arange(10.,35.,5.))
m.drawmeridians(np.arange(-120.,-80.,10.))
m.drawmapboundary(fill_color='aqua')
colors = {'CCM': 'red', 'SCME': 'white', 'SCM': 'yellow'}
for cat, track in df.groupby('Cat'):
latitude = track.Lat.values
longitude = track.Lon.values
#Convert latitude and longitude to coordinates X and Y
x, y = m(longitude, latitude)
#Plot the points on the map
pl.plot(x,y,'-', label=cat, color=colors[cat])
lg = pl.legend()
lg.get_frame().set_facecolor('grey')