Я ищу способ нарисовать заполненные прямоугольники на Basemap. Я мог бы легко рисовать прямоугольники с помощью метода drawgreatcircle
, но я не могу найти способ фактически заполнить эти прямоугольники (указав цвет и альфа).
Как рисовать прямоугольники на базовой карте
Ответ 1
Вы можете добавить matplotlib.patches.Polygon() прямо к своим осям. Вопрос в том, хотите ли вы, чтобы ваши прямоугольники определяли координаты участка (прямые линии на графике) или в координатах карты (большие круги на графике). В любом случае вы указываете вершины в координатах карты, а затем преобразуете их в график координат, вызывая экземпляр Basemap (m()
в приведенном ниже примере), самостоятельно создавайте Polygon и добавляйте его вручную к отображаемым осям.
Для прямоугольников, определенных в графических координатах, здесь приведен пример:
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()
) и снова создаем многоугольник с координатами графика.
Ответ 2
Аналогичный ответ выше, но более простой код:
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()