Matplotlib 如何在底图上绘制矩形

Matplotlib 如何在底图上绘制矩形,matplotlib,matplotlib-basemap,Matplotlib,Matplotlib Basemap,我正在寻找一种在底图上绘制填充矩形的方法。我可以使用drawgreatcircle方法轻松地绘制矩形的边,但我找不到实际填充这些矩形的方法(指定颜色和alpha)。您可以将matplotlib.patches.Polygon()直接添加到轴上。问题是您希望矩形定义为绘图坐标(绘图上的直线)还是地图坐标(绘图上的大圆)。无论哪种方式,都可以在地图坐标中指定顶点,然后通过调用Basemap实例(在下面的示例中为m())将它们转换为打印坐标,然后自己构建多边形,并手动将其添加到要渲染的轴中 对于在打印

我正在寻找一种在底图上绘制填充矩形的方法。我可以使用
drawgreatcircle
方法轻松地绘制矩形的边,但我找不到实际填充这些矩形的方法(指定颜色和alpha)。

您可以将matplotlib.patches.Polygon()直接添加到轴上。问题是您希望矩形定义为绘图坐标(绘图上的直线)还是地图坐标(绘图上的大圆)。无论哪种方式,都可以在地图坐标中指定顶点,然后通过调用Basemap实例(在下面的示例中为
m()
)将它们转换为打印坐标,然后自己构建多边形,并手动将其添加到要渲染的轴中

对于在打印坐标中定义的矩形,以下是一个示例:

from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

def draw_screen_poly( lats, lons, m):
    x, y = m( lons, lats )
    xy = zip(x,y)
    poly = Polygon( xy, facecolor='red', alpha=0.4 )
    plt.gca().add_patch(poly)

lats = [ -30, 30, 30, -30 ]
lons = [ -50, -50, 50, 50 ]

m = Basemap(projection='sinu',lon_0=0)
m.drawcoastlines()
m.drawmapboundary()
draw_screen_poly( lats, lons, m )

plt.show()
对于在地图坐标中定义的矩形,请使用相同的方法,但在转换为打印坐标之前在地图空间中插入直线。对于每个线段,您必须执行以下操作:

lats = np.linspace( lat0, lat1, resolution )
lons = np.linspace( lon0, lon1, resolution )

然后将这些地图坐标转换为绘图坐标(如上所述,使用
m()
),然后再次使用绘图坐标创建多边形。

与上面的答案类似,但更基本的代码是:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

map = Basemap(projection='cyl')

map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()

x1,y1 = map(-25,-25)
x2,y2 = map(-25,25)
x3,y3 = map(25,25)
x4,y4 = map(25,-25)
poly = Polygon([(x1,y1),(x2,y2),(x3,y3),(x4,y4)],facecolor='red',edgecolor='green',linewidth=3)
plt.gca().add_patch(poly)

plt.show()

用安德鲁的答案,我得到了错误

TypeError: len() of unsized object.
但是,将zip转换为列表可以解决这一问题

完整代码:

from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

def draw_screen_poly( lats, lons, m):
    x, y = m( lons, lats )
    xy = zip(x,y)
    poly = Polygon( list(xy), facecolor='red', alpha=0.4 )
    plt.gca().add_patch(poly)

lats = [ -30, 30, 30, -30 ]
lons = [ -50, -50, 50, 50 ]

m = Basemap(projection='sinu',lon_0=0)
m.drawcoastlines()
m.drawmapboundary()
draw_screen_poly( lats, lons, m )

plt.show()