2015-02-09 59 views
0

我想在Basemap模塊中創建一個流圖,但是我得到一個空白球體。請幫我解決這個問題。我使用matplotlib 1.3和普通的streamplot工作正常。Basemap streamplot blank sphere

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

map = Basemap(projection='ortho',lat_0=45,lon_0=-100,resolution='l') 

# draw lat/lon grid lines every 30 degrees. 
map.drawmeridians(np.arange(0,360,30)) 
map.drawparallels(np.arange(-90,90,30)) 

# prepare grids 
lons = np.linspace(0, 2*np.pi, 100) 
lats = np.linspace(-np.pi/2, np.pi/2, 100) 
lons, lats = np.meshgrid(lons, lats) 

# parameters for vector field 
beta = 0.0 
alpha = 1.0 

u = -np.cos(lats)*(beta - alpha*np.cos(2.0*lons)) 
v = alpha*(1.0 - np.cos(lats)**2)*np.sin(2.0*lons) 
speed = np.sqrt(u*u + v*v) 

# compute native map projection coordinates of lat/lon grid. 
x, y = map(lons*180./np.pi, lats*180./np.pi) 

# contour data over the map. 
cs = map.streamplot(x, y, u, v, latlon = True, color = speed, cmap=plt.cm.autumn, linewidth=0.5) 
plt.show() 

回答

0

我不能確切地告訴你什麼是錯的,但是從matplotlib.streamplot手冊:

matplotlib.pyplot.streamplot(x, y, u, v, density=1, linewidth=None, 
color=None, cmap=None, norm=None, arrowsize=1, arrowstyle=u'-|>', 
minlength=0.1, transform=None, zorder=1, hold=None)¶ 

Draws streamlines of a vector flow. 

    x, y : 1d arrays 
     an evenly spaced grid. 
    u, v : 2d arrays 
     x and y-velocities. Number of rows should match length of y, and the number of columns should match x. 
從matplotlib.basemap.streamplot

另外,你可以閱讀

If latlon keyword is set to True, x,y are intrepreted as longitude and latitude in degrees. 

這對應於x和y應該是1D數組(lat,lon)的事實。然而,在你的榜樣x和y是

>>> np.shape(x) 
(100, 100) 
>>> np.shape(y) 
(100, 100) 

然後再調用方法映射()「來計算緯度/經度網格的原生地圖投影座標」,這是巧合與您的basemap.map的名字。所以這取決於你想要哪一個?因爲兩者都會返回一個值! (或者更好地說,兩者都會返回一個錯誤)

從你的u數組中取出你的值。他們的範圍是e-17。而其他值很容易在e + 30的範圍內。 IIRC你得到流線的方式是通過求解一個微分方程,在這個微分方程中,你將它作爲值發送的點用作你發送座標處的參數。不難想象,在計算某些數值時會發生浮點四捨五入,並且您突然開始獲得NaN或0值。

嘗試更好地擴展您的示例,或者如果您想要追求解決方案到最後,您可以嘗試使用np.seterr以獲取有關其失敗的更詳細信息。

對不起,我不能有更大的幫助。