4
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] ​​を列が表す配列を取得します。ここで、メキシコの地図に 1 列目と 2 列目をプロットできるコードを追加します。

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

3 つの異なるパスに対応するマップ上にプロットされたポイント。最終的なアイデアは、各パスに関連付けられたポイントを結ぶ線を引くことです。どうすればこれを行うことができますか?

各パスの識別子またはマークを描画できますか?

ポイント間の分離を区別できるように、図形のサイズを設定するにはどうすればよいですか?

4

2 に答える 2

7

figureFigure のサイズは、を呼び出す前に を作成するだけで設定できますBasemap。(パスごとに)簡単にグループ化できるため、Pandasを使用してCSVを読み取りました。Pandas を使用したくない場合は、反復処理np.unique('cat')などで同じ結果が得られる可能性があります。pandas のインデックスとしてを使用するdatetimeと、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')

ここに画像の説明を入力

于 2013-01-28T09:11:16.310 に答える
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 のパスです。最後に 1 つだけ質問があります。各嵐の始まりをどのように示すことができるでしょうか。

X軸(xlabel = 'Latitude')に「Longitud」を書くように彼に言ったとき、長さの値に単語を上書きします. 緯度の値の下に単語を書くにはどうすればよいですか?

于 2013-02-12T20:11:35.210 に答える