python-2.7 - 使用 basemap 在 map 上绘制轨迹

标签 python-2.7 matplotlib matplotlib-basemap

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']]

使用上面的代码,我得到一个数组,其列表示:[纬度、经度、日期、标识符、温度、类别]。现在,我将放置一个代码,允许我在墨西哥 map 上绘制第一列和第二列:
#!/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()

map 上绘制的点,对应于三个不同的路径。 Mi 最后的想法是画一条线连接与每条路径相关的点,我怎么能做到这一点?

是否可以为每条路径绘制标识符或标记?

我如何设置图形的大小,以便它可以区分点之间的间隔?

最佳答案

只需创建一个 figure 即可设置图形的大小调用前 Basemap .我使用 Pandas 来读取 CSV,因为它允许轻松分组(每个路径)。如果您不想使用 Pandas,您可能可以通过迭代 np.unique('cat') 获得相同的结果。或者其他的东西。如果您使用 datetime作为 Pandas 中的索引,在您的 CSV 未排序的情况下,您的积分会自动按时间排序。

我不确定你画一个标识符是什么意思。图例可以区分路径,但您也可以绘制 'Cat'例如,在 map 上一行的开头或结尾。

您的 map 属性使其对于如此小的路径有点“缩小”。使用 ax = pl.gca()ax.set_xlim()允许您在 map 坐标中设置边界框。您可以从路径中的最大和最小坐标 + 一些缓冲区中得出。

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')

enter image description here

关于python-2.7 - 使用 basemap 在 map 上绘制轨迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14556430/

相关文章:

android - kivy中的文件处理

python-2.7 - Python从数据中删除异常值

python - 安装 basemap 时出现 UnsatisfiableError

python - 在 matplotlib-basemap 中绘制颜色编码标记

python - 停止 contourf 插值

python - 用于输出到文件的密码生成器

Python:绘制从x轴上的点(X1,0)到点(X2,Y2)的线的问题

python - 如何调整条形图的图形间距。 Matplotlib

python-2.7 - 使用MPLD3制作交互式条形图

python - zipimporter 找不到/加载子模块