我需要在我的底图中添加几个矩形。我有四个带有lat和log范围的矩形,如下所示。
1)llcrnrlon = -10,urcrnrlon = 10,llcrnrlat = 35,urcrnrlat = 60
2)llcrnrlon = 10.5,urcrnrlon = 35,llcrnrlat = 35,urcrnrlat = 60
3)llcrnrlon = 35.5,urcrnrlon = 52,llcrnrlat = 30,urcrnrlat = 55
4)llcrnrlon = -20,urcrnrlon = 35,llcrnrlat = 20,urcrnrlat = 34.5
我的脚本如下。我找到了“多边形”包来添加行,但我不知道该怎么做。请帮我!!非常感谢您的帮助!
from mpl_toolkits.basemap import Basemap
m=basemaputpart.Basemap(llcrnrlon=-60, llcrnrlat=20, urcrnrlon=60, urcrnrlat=70, resolution='i', projection='cyl', lon_0=0, lat_0=45)
lon1=np.array([[-180.+j*0.5 for j in range(721)] for i in range(181)])
lat1=np.array([[i*0.5 for j in range(721)] for i in range(181) ])
Nx1,Ny1=m(lon1,lat1,inverse=False)
toplot=data[:,:]
toplot[data==0]=np.nan
toplot=np.ma.masked_invalid(toplot)
plt.pcolor(Nx1,Ny1,np.log(toplot),vmin=0, vmax=5)
cbar=plt.colorbar()
m.drawcoastlines(zorder=2)
m.drawcountries(zorder=2)
llcrnrlon = -10
urcrnrlon = 10
llcrnrlat = 35
urcrnrlat = 60
lower_left = (llcrnrlon, llcrnrlat)
lower_right= (urcrnrlon, llcrnrlat)
upper_left = (llcrnrlon, urcrnrlat)
upper_right= (urcrnrlon, urcrnrlat)
plot_rec(m, lower_left, upper_left, lower_right, upper_right)
然后我看到“Type Error:'tuple'对象不可调用”
而不是这部分,我首先添加了你建议的那个。
..
m.drawcoastlines(zorder=2)
m.drawcountries(zorder=2)
def plot_rec(m, lower_left, upper_left, lower_right, upper_right):
xs = [lower_left[-10], upper_left[-10],
lower_right[10], upper_right[10]]
ys = [lower_left[35], upper_left[60],
lower_right[35], upper_right[60]]
m.plot(xs,ys,latlon=True)
plt.show()
然后我在剧情中看不到任何方框。我必须放另一个,而不是plt.show()??
另外,你能让我知道如何在盒子里放数字(例如,盒子左上角的1)?如何在我的数据的所有点获得值的总和并得到(框中值的值)的百分比(我的数据的所有点的值的总和)?我问得太多了..让我知道你能给我什么,无论如何都会很棒!!!
非常感谢!!
答案 0 :(得分:3)
关于这一点的棘手问题是,“矩形”在很多很多投影类型上并不是真正的“矩形”。所以当你说'矩形'时,你的意思是地图空间中的实际矩形,还是像素空间中的矩形?这两者需要非常不同的
但是我们假设你想要它在地图空间中。最快的方法是使用Basemap的plot方法,如下所示:
def plot_rec(bmap, lower_left, upper_left, lower_right, upper_right):
xs = [lower_left[0], upper_left[0],
lower_right[0], upper_right[0],
lower_left[0], lower_right[0],
upper_left[0], upper_right[0]]
ys = [lower_left[1], upper_left[1],
lower_right[1], upper_right[1],
lower_left[1], lower_right[1],
upper_left[1], upper_right[1]]
bmap.plot(xs, ys, latlon = True)
其中bmap
是你的地图,lower_left
等是那些角落的lon-lat元组。
使用示例进行更新:
你问了一个用法示例,所以你去了:
m=basemaputpart.Basemap(llcrnrlon=-60, llcrnrlat=20, urcrnrlon=60, urcrnrlat=70, resolution='i', projection='cyl', lon_0=0, lat_0=45)
# your other setting up the map code here
# here I draw the first rectangle
llcrnrlon = -10
urcrnrlon = 10
llcrnrlat = 35
urcrnrlat = 60
lower_left = (llcrnrlon, llcrnrlat)
lower_right= (urcrnrlon, llcrnrlat)
upper_left = (llcrnrlon, urcrnrlat)
upper_right= (urcrnrlon, urcrnrlat)
plot_rec(m, lower_left, upper_left, lower_right, upper_right) # This calls the function I defined before
# Rinse and repeat for the other lat/lon combos
plt.show()
你绝对可以使用列表推导来更优雅地生成正确的角点集,但这应该可以让你开始。
更新2
所以看来这里有一些混乱。 plot_rec
是function。它应放置在与脚本其余部分不一致的位置。它本身并没有做任何事情。当你在这里调用时会这样做:
...
upper_left = (llcrnrlon, urcrnrlat)
upper_right= (urcrnrlon, urcrnrlat)
# This next line is where we call the function
plot_rec(m, lower_left, upper_left, lower_right, upper_right)
答案 1 :(得分:1)
这个功能应该做你需要的。 bmap 是您的底图对象, lonmin,lonmax,latmin,latmax 以纬度/经度术语定义您的域。您需要在代码中通过调用底图(...)生成 bmap 后调用plot_rectangle
函数。
def plot_rectangle(bmap, lonmin,lonmax,latmin,latmax):
xs = [lonmin,lonmax,lonmax,lonmin,lonmin]
ys = [latmin,latmin,latmax,latmax,latmin]
bmap.plot(xs, ys,latlon = True)
答案 2 :(得分:0)
相反,如果您正在地图空间中寻找矩形,其边界遵循平行线和子午线,则以下函数对我有用。 m是底图对象。
def draw_screen_poly( minlat, maxlat, minlon, maxlon, m):
lons=np.hstack((np.repeat(minlon,10),\
np.linspace(minlon,maxlon, num=10),\
np.repeat(maxlon,10),\
np.linspace(maxlon,minlon, num=10)))
lats=np.hstack((np.linspace(minlat,maxlat, num=10),\
np.repeat(maxlat,10),\
np.linspace(maxlat,minlat, num=10),
np.repeat(minlat,10)))
m.plot(y=lats,x=lons,latlon=True, lw=2, color='navy', alpha=0.8)
x, y = m(lons, lats)
xy = zip(x,y)
poly = Polygon( np.asarray(xy), linewidth=3)
ax.add_patch(poly)