首页 > 解决方案 > 如何使用 Cartopy 更新 GeoAxes 的投影?

问题描述

我正在尝试使用添加到 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())

但是,根据 matplotlib dox,它会引发错误。

有任何想法吗?

编辑:

如果不是很明显...您将需要在 iPython 控制台中运行它并在图形打开时运行这些额外的命令才能对其进行编辑。为了实现我想做的事情,必须这样做。我知道我可以用新的投影制作一个新的轴,但是,这个项目的最终目标是维护这个轴。这是为了我的项目需要的编辑和不同的查看目的。另外,我一直在使用 matplotlib 和 cartopy,所以请不要推荐新的绘图库。

在阅读这个问题时,我注意到我经常使用“但是”。

标签: pythonmatplotlibcartopymap-projections

解决方案


推荐阅读