我正在尝试根据具有以下形状的lon / lat数组在地图(底图)上绘制数据:
lon (Ntracks, Npoints)
lat (Ntracks, Npoints)
data(Ntracks, Npoints, Ncycles)
问题在于,使用下面的代码,地图上没有显示任何内容(而且速度非常慢!甚至接近内存不足错误......)。我可能使用了错误的方法。我可以帮助您将此3D数据阵列转换为2D数据以使用pcolormesh功能吗?
map = Basemap(projection='mill',lat_ts=10,\
llcrnrlon= -11.01472, \
urcrnrlon= 2.769825, \
llcrnrlat= 43.292, \
urcrnrlat= 52.10833, \
resolution='l')
# Zone
lonmin, lonmax = map.lonmin, map.lonmax
latmin, latmax = map.latmin, map.latmax
# Missing value
misval = 99.999
# Masks on Lon/Lat arrays
lon = np.ma.masked_where(np.isnan(lon) == True, lon)
lat = np.ma.masked_where(np.isnan(lat) == True, lat)
lon = np.ma.masked_where(lon <= lonmin, lon)
lon = np.ma.masked_where(lon >= lonmax, lon)
lat = np.ma.masked_where(lat <= latmin, lat)
lat = np.ma.masked_where(lat >= latmax, lat)
# Dimensions
Ntracks, Npoints, Ncycles = data.shape
'''
#-----------------
# TRACKS LOCATIONS
# IT WORKS => SEE FIGURE POSTED BELOW
#-----------------
for track in range(Ntracks):
x, y = map( *np.meshgrid( lon[track,:], lat[track,:] ))
y = y.T
map.plot(x, y, marker= 'o', \
markersize=1.5, \
color='#0B610B',
markeredgecolor='#0B610B')
'''
#-----------------
# TRACKS DATA
# => NOT WORKING !!
#-----------------
Data = np.full( (Npoints*Npoints), misval )
for track in range(Ntracks):
x, y = map( *np.meshgrid( lon[track,:], lat[track,:] ))
y = y.T
for c in range(Ncycles):
Data[0:Npoints] = data[track,:,c]
Data = np.ma.masked_where(np.isnan(Data) == True, Data)
Data = np.ma.masked_where(Data >= misval, Data)
Data = Data.reshape( (Npoints, Npoints) )
# plot Data on the map
map.pcolormesh(x, y, Data)
parallels = np.arange( latmin, latmax, 2., dtype= 'int')
meridians = np.arange( lonmin, lonmax, 2., dtype= 'int')
map.drawcoastlines(linewidth=1.5, color='white')
map.drawcountries(linewidth=1.5, color='grey')
map.drawparallels(parallels, labels= [1,0,0,0], color= 'black', fontsize=16, linewidth=0)
map.drawmeridians(meridians, labels= [0,0,0,1], color= 'black', fontsize= 16, linewidth=0)
map.drawmapboundary(color='k',linewidth=2.0)
map.fillcontinents(color='#cdc5bf')
此代码不会产生错误,但地图上没有数据显示...
下面是代码在Ntracks = 1和Ncycles = 4的输出中返回的示例:
FILE 0 TRACK 011
CYCLE 1
[[-- 60.779693603515625 60.658145904541016 ..., 0.0 0.0 0.0]
[-- 60.779693603515625 60.658145904541016 ..., 0.0 0.0 0.0]
[-- 60.779693603515625 60.658145904541016 ..., 0.0 0.0 0.0]
...,
[-- 60.779693603515625 60.658145904541016 ..., 0.0 0.0 0.0]
[-- 60.779693603515625 60.658145904541016 ..., 0.0 0.0 0.0]
[-- 60.779693603515625 60.658145904541016 ..., 0.0 0.0 0.0]]
CYCLE 2
[[-- 60.7838249206543 60.666202545166016 ..., 0.0 0.0 0.0]
[-- 60.7838249206543 60.666202545166016 ..., 0.0 0.0 0.0]
[-- 60.7838249206543 60.666202545166016 ..., 0.0 0.0 0.0]
...,
[-- 60.7838249206543 60.666202545166016 ..., 0.0 0.0 0.0]
[-- 60.7838249206543 60.666202545166016 ..., 0.0 0.0 0.0]
[-- 60.7838249206543 60.666202545166016 ..., 0.0 0.0 0.0]]
CYCLE 3
[[-- -- -- ..., 0.0 0.0 0.0]
[-- -- -- ..., 0.0 0.0 0.0]
[-- -- -- ..., 0.0 0.0 0.0]
...,
[-- -- -- ..., 0.0 0.0 0.0]
[-- -- -- ..., 0.0 0.0 0.0]
[-- -- -- ..., 0.0 0.0 0.0]]
CYCLE 4
[[-- -- -- ..., 0.0 0.0 0.0]
[-- -- -- ..., 0.0 0.0 0.0]
[-- -- -- ..., 0.0 0.0 0.0]
...,
[-- -- -- ..., 0.0 0.0 0.0]
[-- -- -- ..., 0.0 0.0 0.0]
[-- -- -- ..., 0.0 0.0 0.0]]
我应该有这样的事情(做一个接近0°lon的治疗) Tracks locations
答案 0 :(得分:0)
这张地图似乎是一个非常好的工具,谢谢你提示:)
如果我做对了,Data应该是一个2D-Array,其中包含每个x-y对的值? 但是你只填充数据的第一个Npoints条目,然后你只是重塑它 - 所以除了第一个Npoints x Npoints矩阵之外,你没有在任何行中写任何东西。这可能不是你想要的,你想把第i个点填充到矩阵的[i,i]元素中。
因此,使用Data = np.full((Npoints, Npoints), np.nan)
创建矩阵,而不是创建长度为N * N的1D矩阵。
然后np.fill_diagonal(Data, data[track, :, c])
我不确定你是否就在那里:
如果
latlon
关键字设置为True,则x,y表示为经度和 纬度(以度为单位)。 [...]
这不是你想要的吗?