【问题标题】:plot trajectories on an map using basemap使用底图在地图上绘制轨迹
【发布时间】:2013-01-11 11:03:21
【问题描述】:
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']]

使用上面的代码,我得到一个数组,其列代表:[Lat, Lon, Date, Identifier, Temperatures, Category]。现在,我将放置一个代码,让我可以在墨西哥地图上绘制第一列和第二列:

#!/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()

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

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

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

【问题讨论】:

  • 您正在寻找类似“大圆圈”的东西吗?见this tutorial

标签: python-2.7 matplotlib matplotlib-basemap


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    感谢您的想法,我留下了正确的代码来绘制任何物体的轨迹,就我而言,我已经绘制了对流风暴的轨迹。

    import numpy as np
    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    fig = plt.figure(figsize=(12,12))
    
    ax = fig.add_axes([0.1,0.1,0.8,0.8])
    
    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)
    

    --- Dibujamos paralelos y meridianos ---

    m.drawparallels(np.arange(10.,35.,5.),labels=[1,0,0,1])
    m.drawmeridians(np.arange(-120.,-80.,5.),labels=[1,0,0,1])
    m.drawmapboundary(fill_color='aqua')
    

    --- Abrimos el archivo que contiene los datos ---

    import pandas as pd
    
    df = pd.read_csv('scm-2004.csv')
    for evento, group in df.groupby(['evento']):
        latitude = group.lat.values
        longitude = group.lon.values
        x,y = m(longitude, latitude)
        plt.plot(x,y,'y-',linewidth=2 )
        plt.xlabel('Longitud')
        plt.ylabel('Latitud')
        plt.title('Trayectorias de Sistemas Convectivos 2004')
    
    plt.savefig('track-2004.jpg', dpi=100)
    

    通过上面的代码,我得到了想要的数字:墨西哥地图上绘制的 60 条路径。 我只有最后一个问题:如何指示每场风暴的开始,有人知道我该怎么做?

    当我告诉他在X轴上写“经度”(xlabel = 'Latitude')会覆盖这个词上的长度值,我怎么能把这个词写在纬度值下面?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 2018-09-01
      • 2020-08-26
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2015-09-09
      相关资源
      最近更新 更多