Я пытаюсь создать несколько интерактивный картографический сюжет с помощью matplotlib, используя кнопку, добавленную на панель инструментов в навигационной панели инструментов Matplotlib.
Цель:
Цель, которую я пытаюсь достичь - это иметь возможность изменять проекцию осей на лету, не создавая новых осей. Есть много методов в объекте осей, который создается Matplotlib для изменения других аспектов графика, но я хочу иметь возможность изменить проекцию, скажем, PlateCarree на NorthPolarStereo и наоборот.
Некоторые источники:
import os
import sys
import matplotlib.pyplot as plt
import matplotlib
import mpl_toolkits
import numpy as np
import cartopy
import cartopy.crs as ccrs
fig = plt.figure()
ax = plt.axes(projection=ccrs.NorthPolarStereo())
ax.stock_img()
ny_lon, ny_lat = -75, 43
delhi_lon, delhi_lat = 77.23, 28.61
plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat],
color='blue', linewidth=2, marker='o',
transform=ccrs.Geodetic(),
)
plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat],
color='gray', linestyle='--',
transform=ccrs.PlateCarree(),
)
ax.add_patch(matplotlib.patches.Polygon([[0,0],[20,0],[20,20],[0,20]],
fill = False,color='g',ls='--',
transform=ccrs.PlateCarree()))
ax.add_patch(matplotlib.patches.Circle([30,30],radius=10,color='g',ls='--',
transform=ccrs.PlateCarree()))
plt.text(ny_lon - 3, ny_lat - 12, 'New York',
horizontalalignment='right',
transform=ccrs.Geodetic())
plt.text(delhi_lon + 3, delhi_lat - 12, 'Delhi',
horizontalalignment='left',
transform=ccrs.Geodetic())
# ax.set_extent([-180,180,-90,90])
ax.set_global()
Проблема: Как видно, оси создаются с проекцией = ccrs.NorthPolarStereo ().
Проекция осей может быть получена путем выполнения следующего:
ax.projection
Затем я пытаюсь установить проекцию ccrs.PlateCarree ()
ax.projection = ccrs.PlateCaree()
Однако это само по себе не обновляет график. Я заметил, что при редактировании некоторых свойств вам нужно снова нарисовать холст с помощью
ax.figure.canvas.draw()
, однако это, похоже, не дает эффекта. Но если я сделаю
ax.set_global()
, чтобы установить экстент на максимум, оси обновятся и перейдут в правильную проекцию ... однако данные на графике не обновляются снова. Тем не менее, вызов
ax.projection
означает, что проекция теперь является проекцией PlateCarree.
Как я могу обновить дочерние элементы осей для отражения этой новой проекции?
У меня есть попробовал
ax.update(ax.properties())
в соответствии с dox matplotlib, однако он выдает ошибку.
Любые идеи?
Редактировать:
Если это не так очевидно ... Вам нужно будет запустить это в консоли i Python и запустить эти дополнительные команды, пока фигура открыта, чтобы редактировать ее. И это нужно сделать так, чтобы добиться того, чего я хочу. Я знаю, что могу просто создать новые оси с новой проекцией, однако конечная цель этого проекта - сохранить эти оси. Это для редактирования и различных целей просмотра, которые требуются моему проекту. Кроме того, я застрял, используя matplotlib и cartopy, поэтому, пожалуйста, никаких новых библиотечных рекомендаций для построения графиков.
Читая этот вопрос, я замечаю, что использую «однако» слишком часто.