Как обновить проекцию GeoAxes с помощью Cartopy? - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь создать несколько интерактивный картографический сюжет с помощью 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, поэтому, пожалуйста, никаких новых библиотечных рекомендаций для построения графиков.

Читая этот вопрос, я замечаю, что использую «однако» слишком часто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...