我有一个numpy数组precip_subset
,其形状为(31, 60, 48)
。 precip_subset
是通过合并31个数据集创建的;数据集中的第一个变量表示日期,第二个变量表示经度,第三个变量表示纬度。数据集中的每个位置都有一个独特的降水值;例如,print(precip_subset[1,0,32])
会给我一个1.05
的值。
我将使用我的代码展示我到目前为止所做的工作:
data_low = precip_subset[(precip_subset > 0) & (precip_subset < 3.14062)]
anomalies = []
for val in data_low:
if val < 1:
anomalies.append(val)
print(anomalies)
data_low_indices1 = np.where((precip_subset > 0) & (precip_subset < 1))
data_low_indices2 = np.array(np.where((precip_subset > 0) & (precip_subset < 1))).T
anomalies_ind = []
for ind in data_low_indices2:
anomalies_ind.append(ind)
print(np.asarray(anomalies_ind))
基本上,使用此代码,我可以在原始数据集precip_subset
中获取降水值及其指数。从这里开始,我想用Basemap绘制这些数据 - 我想在地图上找到一个发现异常的点。 precip_subset
的创建方式如下:
data_path = r"C:\Users\matth\Downloads\TRMM_3B42RT\3B42RT_Daily.201001.7.nc4"
f = Dataset(data_path)
latbounds = [ -31 , -19 ]
lonbounds = [ 131, 146 ]
lats = f.variables['lat'][:]
lons = f.variables['lon'][:]
# latitude lower and upper index
latli = np.argmin( np.abs( lats - latbounds[0] ) )
latui = np.argmin( np.abs( lats - latbounds[1] ) )
# longitude lower and upper index
lonli = np.argmin( np.abs( lons - lonbounds[0] ) )
lonui = np.argmin( np.abs( lons - lonbounds[1] ) )
precip_subset = f.variables['precipitation'][ : , lonli:lonui , latli:latui ]
这是我到目前为止使用Basemap绘制数据的方法:
m = Basemap(llcrnrlon=131.,llcrnrlat=-31,urcrnrlon=146.,urcrnrlat=-19.)
m.drawcoastlines()
m.drawparallels(np.arange(-90., 120., 30.), labels=[1, 0, 0, 0])
m.drawmeridians(np.arange(-180., 181., 45.), labels=[0, 0, 0, 1])
m.imshow(anomalies_ind)
plt.show()
然而,我得到的图像不是我想要的(见下图)。
有谁知道我如何使用Basemap绘制anomalies_ind
,并找到每个异常的点?
答案 0 :(得分:0)
imshow
只是将您提供的数据绘制成图像,覆盖其他任何内容。所以绝对不是你想要的。既然你没有给出anomalies_ind
形状的任何指示,我在这里举了一个例子。您需要做的就是将lats和lons映射到x / y像素坐标,并绘制它们。 'o'
参数plot
仅表示绘制圆圈,而不是线条。
anomalies_ind = [(-29.027008, 135.547227),
(-22.774524, 137.824754)]
lats = np.array(anomalies_ind)[:, 0]
lons = np.array(anomalies_ind)[:, 1]
m = Basemap(llcrnrlon=131.,llcrnrlat=-31,urcrnrlon=146.,urcrnrlat=-19.)
m.drawcoastlines()
m.drawparallels(np.arange(-90., 120., 30.), labels=[1, 0, 0, 0])
m.drawmeridians(np.arange(-180., 181., 45.), labels=[0, 0, 0, 1])
#m.imshow(anomalies_ind)
x, y = m(lons, lats)
m.plot(x, y, 'o')
plt.show()