Python streamplot不适用于matplotlib basemap

Python streamplot不适用于matplotlib basemap,python,vector,matplotlib,stream,matplotlib-basemap,Python,Vector,Matplotlib,Stream,Matplotlib Basemap,我正在尝试使用streamplot功能,用底图、投影绘制风场“ortho”。我的测试代码主要基于以下示例: 这是我的密码: import numpy as np import matplotlib.pyplot as plt import datetime from mpl_toolkits.basemap import Basemap, shiftgrid from Scientific.IO.NetCDF import NetCDFFile as Dataset # specify da

我正在尝试使用streamplot功能,用底图、投影绘制风场
“ortho”
。我的测试代码主要基于以下示例:

这是我的密码:

import numpy as np
import matplotlib.pyplot as plt
import datetime
from mpl_toolkits.basemap import Basemap, shiftgrid
from Scientific.IO.NetCDF import NetCDFFile as Dataset

# specify date to plot.
yyyy=1993; mm=03; dd=14; hh=00
date = datetime.datetime(yyyy,mm,dd,hh)
# set OpenDAP server URL.
URLbase="http://nomads.ncdc.noaa.gov/thredds/dodsC/modeldata/cmd_pgbh/"
URL=URLbase+"%04i/%04i%02i/%04i%02i%02i/pgbh00.gdas.%04i%02i%02i%02i.grb2" %\
         (yyyy,yyyy,mm,yyyy,mm,dd,yyyy,mm,dd,hh)
data = Dataset(URL)
#data = netcdf.netcdf_file(URL)
# read lats,lons
# reverse latitudes so they go from south to north.
latitudes = data.variables['lat'][:][::-1]
longitudes = data.variables['lon'][:].tolist()
# get wind data
uin = data.variables['U-component_of_wind_height_above_ground'][:].squeeze()
vin = data.variables['V-component_of_wind_height_above_ground'][:].squeeze()
# add cyclic points manually (could use addcyclic function)
u = np.zeros((uin.shape[0],uin.shape[1]+1),np.float64)
u[:,0:-1] = uin[::-1]; u[:,-1] = uin[::-1,0]
v = np.zeros((vin.shape[0],vin.shape[1]+1),np.float64)
v[:,0:-1] = vin[::-1]; v[:,-1] = vin[::-1,0]
longitudes.append(360.); longitudes = np.array(longitudes)
# make 2-d grid of lons, lats
lons, lats = np.meshgrid(longitudes,latitudes)
# make orthographic basemap.
m = Basemap(resolution='c',projection='ortho',lat_0=60.,lon_0=-60.)
# create figure, add axes
fig1 = plt.figure(figsize=(8,10))
ax = fig1.add_axes([0.1,0.1,0.8,0.8])
# define parallels and meridians to draw.
parallels = np.arange(-80.,90,20.)
meridians = np.arange(0.,360.,20.)
# first, shift grid so it goes from -180 to 180 (instead of 0 to 360
# in longitude).  Otherwise, interpolation is messed up.
ugrid,newlons = shiftgrid(180.,u,longitudes,start=False)
vgrid,newlons = shiftgrid(180.,v,longitudes,start=False)
# now plot.
lonn, latt = np.meshgrid(newlons, latitudes)
x, y = m(lonn, latt)
st = plt.streamplot(x, y, ugrid, vgrid, color='r', latlon='True')
# draw coastlines, parallels, meridians.
m.drawcoastlines(linewidth=1.5)
m.drawparallels(parallels)
m.drawmeridians(meridians)
# set plot title
ax.set_title('SLP and Wind Vectors '+str(date))
plt.show()
运行代码后,我得到了一个在左下角有红色污点的空白地图(请参见图)。放大这张涂片后,我可以在平面投影(而不是“正交”投影)中看到气流,所以我想这是地图上数据投影的问题。我确实试过函数
变换向量
但它不能解决问题。有人能告诉我,我做错了什么吗!多谢各位

更新代码后的新地图:

您正在使用正交投影在地图上绘制
lat/lon
坐标。通常,可以通过将打印命令更改为:

m.streamplot(mapx, mapy, ugrid, vgrid, color='r', latlon=True)

但是您的坐标阵列没有相同的尺寸,这也需要固定。

谢谢@Rutger Kassies。我添加了两行代码:
lono,latt=np.meshgrid(新线,纬度)x,y=m.(lonn,latt)
然后
m.streamplot(x,y,ugrid,vgrid,color='r',latlon=True)
。现在,我在屏幕上看到一个空白映射,上面有一条奇怪的线和一些消息
packages/numpy/ma/core.py:802:RuntimeWarning:less返回umath.less(x,self.critical_value)时遇到无效值
。请参阅上面的更新代码和新的空白地图