python - 如何使用 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,所以请不要推荐新的绘图库。
在阅读这个问题时,我注意到我经常使用“但是”。
解决方案
推荐阅读
- swift - 如何在 Xcode 中拥有良好的项目代码组织?
- python - 运行 buildozer 时错误 13 权限被拒绝
- php - 谷歌日历 API - PHP
- truclient - Loadrunner TC 协议
- javascript - 在 React Js 中更改图像 onClick
- java - 具有“类名”对象的新手
- git - 如何在不创建单独提交的情况下仅将文件提交到一组远程存储库中的一个?
- api - 利用 ZAP 进行 RESTAPI 测试
- c++ - 使用 GetModuleFileNameEx 分配缓冲区
- ios - 为什么我不能在 UIView 默认背景层上为自定义属性设置动画?