2016-09-24 2 views
1

Robinson 투영법을 사용하여 글로벌 맵에 유선형을 플로팅하려하지만,베이스 맵이 투영 된 좌표를 좋아하지 않는 것 같습니다. 물론 x 방향으로 규칙적인 평범한 오래된 원통형 프로젝션에서는 잘 작동합니다.Robinson 투영에 유선형을 그릴 수 있습니까?

import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
import numpy as np 

u = np.ones((21,21)) 
v = np.ones((21,21)) 
lats = np.arange(-90,91,9) 
lons = np.arange(-180,181,18) 
x,y = np.meshgrid(lons,lats) 

# It works for Cylindrical 
mp = Basemap(projection='cyl') 
xx,yy = mp(x,y) 
mp.streamplot(xx,yy,u,v) 
mp.drawcoastlines() 
plt.show() 

# But not Robinson 
mp = Basemap(projection='robin',lon_0=0) 
xx, yy = mp(x, y) 
mp.streamplot(xx,yy,u,v) 
mp.drawcoastlines() 
plt.show() 

그것은 제기는 x 좌표에 대해 불평 :

ValueError: The rows of 'x' must be equal 

그래서이 가능 음모에 로빈슨의 예상을 간소화 여기

은 예입니다?

답변

0

xx,yy = mp(x,y) 명령을 사용하면 특정 투영법에 따른 좌표 변환이 사용자의 lon 및 lats에 적용됩니다. 대부분의 투영에서는 x 행이 더 이상 동일하지 않으므로 gird 점의 뒤틀림이 발생하므로 오류 : ValueError: The rows of 'x' must be equal이 발생합니다. 이 문제를 해결하려면 데이터를 다시 그리드해야합니다 (예 : 이렇게 :

import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
import numpy as np 
import matplotlib as plt 

u = np.ones((21,21)) 
v = np.ones((21,21)) 
lats = np.arange(-90,91,9) 
lons = np.arange(-180,181,18) 
x,y = np.meshgrid(lons,lats) 

mp = Basemap(projection='robin',lon_0=0) 
xx, yy = mp(x, y) 

# generate a grid that is equally spaced in a plot with the current pojection 
lons, lats, xxnew, yynew = mp.makegrid(21,21, returnxy=True) 

# project the data onto the new grid 
unew = plt.mlab.griddata(xx.flatten(), yy.flatten(),u.flatten(), xxnew, yynew ,interp='linear') 
vnew = plt.mlab.griddata(xx.flatten(), yy.flatten(),v.flatten(), xxnew, yynew ,interp='linear') 

mp.streamplot(xxnew,yynew,unew,vnew) 
mp.drawcoastlines() 
plt.show()