底图streamplot空白球体

时间:2015-02-09 10:17:18

标签: python matplotlib-basemap

我想在Basemap模块中制作一个streamplot,但是我得到一个空白球体。请帮我解决这个问题。我使用matplotlib 1.3和普通的streamplot工作正常。

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

1 个答案:

答案 0 :(得分: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)

然后再次调用方法map()"来计算lat / lon网格的原生地图投影坐标"这与您的basemap.map的名称恰好相同。所以这取决于你想要哪一个?因为两者都会返回一个值! (或者更好的说,两者都会返回错误)

另外检查你的u数组中的值。它们的范围是e-17。而其他值很容易在e + 30范围内。 IIRC您获得流线的方法是求解微分方程,其中您将其作为值发送的点用作您发送的坐标处的参数。不难想象,在计算具有这些数字的东西时会发生浮点舍入,并且您突然开始获得NaN或0值。

尝试更好地扩展您的示例,或者如果您想要追求最终的解决方案,您可以尝试使用np.seterr来更详细地了解它失败的位置。

抱歉,我无法提供更大的帮助。