如何使用Basemap绘制点

时间:2017-08-02 14:51:16

标签: python matplotlib matplotlib-basemap

我有一个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()

然而,我得到的图像不是我想要的(见下图)。

enter image description here

有谁知道我如何使用Basemap绘制anomalies_ind,并找到每个异常的点?

1 个答案:

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