2013-10-21 46 views
3

對不起,如果這個問題很簡單,我是使用Python和底圖的新手。無論如何,我試圖在地圖上繪製20條颶風的路徑(圖表)。地圖本身和圖例完美展現,但颶風的路徑卻沒有。此外,我沒有收到任何回溯消息,但我想我有我的問題可能在哪裏的想法。有人能告訴我我哪裏出錯了。使用Python /底圖不在圖上繪製的線

下面是CSV文件的樣本:

Year, Name, Type, Latitude, Longitude 
1957,AUDREY,HU, 21.6, 93.3 
1957,AUDREY,HU,22.0, 93.4 
1957,AUDREY,HU,22.6, 93.5 
1969,AUDREY,HU,28.2,99.6 
1957,AUDREY,HU,26.5,93.8 
1957,AUDREY,HU,27.9,93.8 
1957,AUDREY,HU,29.3,95 
1957,AUDREY,HU,27.9,93.8 
1957,AUDREY,HU,29.3,93.8 
1957,AUDREY,HU,30.7,93.5 
1969,CAMILLE,HU, 21.6,99.3 
1969,CAMILLE,HU,22.0,98.4 
1969,CAMILLE,HU,22.6,90.5 
1969,CAMILLE,HU,23.2,93.6 

這裏是我到目前爲止的代碼:

import numpy as np 
from mpl_toolkits.basemap import Basemap 
import matplotlib.pyplot as plt 
import csv, os, scipy 
import pandas 
from PIL import * 


data = np.loadtxt('louisianastormb.csv',dtype=np.str,delimiter=',',skiprows=1) 
'''print data''' 
fig = plt.figure(figsize=(12,12)) 

ax = fig.add_axes([0.1,0.1,0.8,0.8]) 

m = Basemap(llcrnrlon=-100.,llcrnrlat=0.,urcrnrlon=-20.,urcrnrlat=57., 
      projection='lcc',lat_1=20.,lat_2=40.,lon_0=-60., 
      resolution ='l',area_thresh=1000.) 

m.bluemarble() 
m.drawcoastlines(linewidth=0.5) 
m.drawcountries(linewidth=0.5) 
m.drawstates(linewidth=0.5) 

# Creates parallels and meridians 
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') 
color_dict = {'AUDREY': 'red', 'ETHEL': 'white', 'BETSY': 'yellow','CAMILLE': 'blue', 'CARMEN': 'green','BABE': 'purple', } 


colnames = ['Year','Name','Type','Latitude','Longitude'] 
data = pandas.read_csv('louisianastormb.csv', names=colnames) 
names = list(data.Name) 
lat = list(data.Latitude) 
long = list(data.Longitude) 
colorName = list(data.Name) 
#print lat 
#print long 
lat.pop(0) 
long.pop(0) 
colorName.pop(0) 
latitude= map(float, lat) 
longitude = map(float, long) 
x, y = m(latitude,longitude) 
#Plots points on map 
for colorName in color_dict.keys(): 
    plt.plot(x,y,linestyle ='-',label=colorName,color=color_dict[colorName], linewidth=5) 
    lg = plt.legend() 
    lg.get_frame().set_facecolor('grey') 
plt.show() 
+0

有可能是你上傳CSV數據文件爲好,或者只是一個剝離VERSI在一個最小的工作示例? – nye17

+0

@ nye17當然,我只是添加了一個csv文件的樣本。我無法上傳整個文件。 – mikez1

回答

5

兩(好吧,我撒謊了,應該有)與您的代碼的問題

我,你輸入的經度應該是否定的是你的底圖定義的邊界內,所以後轉換之前添加此x和y

longitude = [-i for i in longitude] 

二,你的座標轉換線是不對的,你應該換LON和LAT參數列表

x, y = m(longitude, latitude) 

代替

x, y = m(latitude,longitude) 

編輯:

還好,第二個問題是OP張貼在評論,請檢查以下內容的完整代碼,並請注意我做了比較,你的變化

# Last-modified: 21 Oct 2013 05:35:16 PM 

import numpy as np 
from mpl_toolkits.basemap import Basemap 
import matplotlib.pyplot as plt 
import csv, os, scipy 
import pandas 
from PIL import * 


data = np.loadtxt('louisianastormb.csv',dtype=np.str,delimiter=',',skiprows=1) 
'''print data''' 
fig = plt.figure(figsize=(12,12)) 

ax = fig.add_axes([0.1,0.1,0.8,0.8]) 

m = Basemap(llcrnrlon=-100.,llcrnrlat=0.,urcrnrlon=-20.,urcrnrlat=57., 
      projection='lcc',lat_1=20.,lat_2=40.,lon_0=-60., 
      resolution ='l',area_thresh=1000.) 

m.drawcoastlines(linewidth=0.5) 
m.drawcountries(linewidth=0.5) 
m.drawstates(linewidth=0.5) 
# m.bluemarble(ax=ax) 

# Creates parallels and meridians 
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') 
color_dict = {'AUDREY': 'red', 'ETHEL': 'white', 'BETSY': 'yellow','CAMILLE': 'blue', 'CARMEN': 'green','BABE': 'purple', } 

colnames = ['Year','Name','Type','Latitude','Longitude'] 
data = pandas.read_csv('louisianastormb.csv', names=colnames) 
names = list(data.Name) 
lat = list(data.Latitude) 
long = list(data.Longitude) 
colorNames = list(data.Name) 
#print lat 
#print long 
lat.pop(0) 
long.pop(0) 
colorNames.pop(0) 
latitude= map(float, lat) 
longitude = map(float, long) 
# added by nye17 
longitude = [-i for i in longitude] 
# x, y = m(latitude,longitude) 
x, y = m(longitude,latitude) 
# convert to numpy arrays 
x = np.atleast_1d(x) 
y = np.atleast_1d(y) 
colorNames = np.atleast_1d(colorNames) 
#Plots points on map 
for colorName in color_dict.keys(): 
    plt.plot(x[colorName == colorNames],y[colorName == colorNames],linestyle ='-',label=colorName,color=color_dict[colorName], linewidth=5) 
    lg = plt.legend() 
    lg.get_frame().set_facecolor('grey') 
plt.show() 

enter image description here

+0

非常感謝!但是現在所有的線條都被繪製成相同的顏色。我該如何解決這個問題,以便颶風的路徑與我的彩色字典中的顏色匹配。例如颶風奧黛麗的路徑將是紅色的,埃塞爾的路徑將是藍色的等。 – mikez1

+0

@ mikez1你應該問每個線程一個問題。如果這個答案解決了你在你原來的帖子中提出的問題,那麼你應該接受它(大灰色複選框)如果你有更多或新的問題,你應該創建一個新的問題線程。 – tacaswell

+0

@tcaswell對不起。 – mikez1

1

我覺得你的困難與其說是在底圖作爲繪圖。您不需要繪製整個x/y數據集,而需要查找與颶風Z相對應的x/y點。然後僅繪製某些顏色的點c。然後找到相應的下一個颶風等點...

下面,雖然沒有使用底圖數據結構應提供一個起點繪製基於某些選擇器向量點的子集。

#given a list of x,y coordinates with a label we'll plot each line individually 

#first construct some points to plot 
x1 = [1,1.1,1.2,1.3, 2.0,2.2,2.3, 4,3.9,3.8,3.7] 
y1 = [5,5.1,5.2,5.3, 6.0,6.2,6.3, 2,2.1,2.2,2.3] 
pointNames = [] 
#generate some labels 
pointNames.extend(['a']*4) 
pointNames.extend(['b']*3) 
pointNames.extend(['c']*4) 

#make things easy by casting to numpy arrays to allow for easier indexing 
x1 = numpy.array(x1) 
y1 = numpy.array(y1) 
pointNames = numpy.array(pointNames) 

for elem in ['a','b','c']: 
    selector = pointNames==elem 
    subsetX = x1[selector] 
    subsetY = y1[selector] 
    #now plot subsetX vs subsetY in color Z 
    plot(subsetX,subsetY,'*-') 

show() 
+0

好的謝謝你的回覆。我想我明白你在說什麼,但是我有一個包含20個颶風,類型和座標等的文件。有沒有簡單的方法根據颶風的名稱對所有座標進行分組並繪製它們? – mikez1

+0

當然,在這種情況下,您可以使用set函數來獲取唯一的字符串名稱(颶風)。 s1 = set(['a','b','c','c'])給出s1 :('a','b','c')作爲元組。你可以遍歷每一個:在s1中的elem。在你的情況下,pointNames是字符串的名稱/數組。所以你會做s1 = set(names)來獲得獨特的颶風名稱,然後循環。 – Paul

+0

好的,在我的代碼中,我已經有了一個颶風名稱的彩色字典(color_dict)。根據我上面的代碼,這是正確的:(我使用n1,因爲名稱已經在我的代碼中使用)'對於n1,data.groupby中的軌道('Name'): latitude = track.Lat.values longitude = track .Lon。值 #將座標X和Y的經度和緯度轉換爲經緯度 x,y = m(經度,緯度) #繪製地圖上的點012.png(x,y,' - ',label = n1,color = colors_dict [n1])' – mikez1