Scatter 不在底图上绘制任何点
Scatter does not plot any points on Basemap
我有一个以这种方式创建的数组 anomalies_ind
:
data_path = r"C:\Users\matth\Downloads\TRMM_3B42RTB42RT_Daily.201001.7.nc4"
f = Dataset(data_path)
latbounds = [ -45 , -10 ]
lonbounds = [ 105, 160 ]
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 ]
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))
输出是这样的:
[[1, 23, 45]
[3, 45, 56]
...
[31, 45, 89]]
第一个元素代表一月份的第几天,而第二个和第三个元素分别代表经度和纬度。我正在尝试在地图上给出的经度和纬度上绘制点,如下所示:
foo = np.asarray(anomalies_ind)
longs = foo[:,1]
lat = foo[:,2]
m = Basemap(llcrnrlon=105.,llcrnrlat=-45,urcrnrlon=160,urcrnrlat=-10)
m.drawcoastlines()
m.fillcontinents(color = 'lightgray', zorder = 0)
m.scatter(longs, lat, marker = 'o', color = 'k', zorder=10)
plt.show()
但是,地图上没有任何点。有谁知道哪里出了问题吗?
编辑:这里是真实 foo
数组的一些值
[[ 0 0 0]
[ 0 0 16]
[ 0 0 17]
...,
[ 30 219 113]
[ 30 219 114]
[ 30 219 116]]
在调用 scatter 之前,您必须将纬度和经度转换为地图投影:
x,y=m(longs,lat)
m.scatter(x, y, marker = 'o', color = 'k', zorder=10)
我自己 运行 遇到了这个问题。
底图绘图函数有一个 latlon
关键字,更改它对我有用。默认值为 latlon=False
,因此 x 和 y 值被解释为投影坐标。添加 latlon=True
告诉 Basemap 将 x 和 y 值解释为地图坐标。
在此处查看有关散点图的底图文档:
http://matplotlib.org/basemap/api/basemap_api.html#mpl_toolkits.basemap.Basemap.scatter
在您原来的绘图语法中,您需要更改以下行:
m.scatter(longs, lat, marker = 'o', color = 'k', zorder=10)
至:
m.scatter(longs, lat, marker = 'o', color = 'k', zorder=10, latlon=True)
我有一个以这种方式创建的数组 anomalies_ind
:
data_path = r"C:\Users\matth\Downloads\TRMM_3B42RTB42RT_Daily.201001.7.nc4"
f = Dataset(data_path)
latbounds = [ -45 , -10 ]
lonbounds = [ 105, 160 ]
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 ]
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))
输出是这样的:
[[1, 23, 45]
[3, 45, 56]
...
[31, 45, 89]]
第一个元素代表一月份的第几天,而第二个和第三个元素分别代表经度和纬度。我正在尝试在地图上给出的经度和纬度上绘制点,如下所示:
foo = np.asarray(anomalies_ind)
longs = foo[:,1]
lat = foo[:,2]
m = Basemap(llcrnrlon=105.,llcrnrlat=-45,urcrnrlon=160,urcrnrlat=-10)
m.drawcoastlines()
m.fillcontinents(color = 'lightgray', zorder = 0)
m.scatter(longs, lat, marker = 'o', color = 'k', zorder=10)
plt.show()
但是,地图上没有任何点。有谁知道哪里出了问题吗?
编辑:这里是真实 foo
数组的一些值
[[ 0 0 0]
[ 0 0 16]
[ 0 0 17]
...,
[ 30 219 113]
[ 30 219 114]
[ 30 219 116]]
在调用 scatter 之前,您必须将纬度和经度转换为地图投影:
x,y=m(longs,lat)
m.scatter(x, y, marker = 'o', color = 'k', zorder=10)
我自己 运行 遇到了这个问题。
底图绘图函数有一个 latlon
关键字,更改它对我有用。默认值为 latlon=False
,因此 x 和 y 值被解释为投影坐标。添加 latlon=True
告诉 Basemap 将 x 和 y 值解释为地图坐标。
在此处查看有关散点图的底图文档: http://matplotlib.org/basemap/api/basemap_api.html#mpl_toolkits.basemap.Basemap.scatter
在您原来的绘图语法中,您需要更改以下行:
m.scatter(longs, lat, marker = 'o', color = 'k', zorder=10)
至:
m.scatter(longs, lat, marker = 'o', color = 'k', zorder=10, latlon=True)