Cartopy生成旋转地球GIF遇静态问题,求高效改投影方法
问题分析
你的代码生成静态GIF的核心原因是:直接修改ax.projection不会触发绘图系统的重绘,而且Cartopy的Axes与投影实例是初始化时绑定的,直接替换投影实例不会让现有图形元素适配新投影。
高效解决方案
要在不重复调用contourf()的前提下实现旋转动画,你可以复用已绘制的等高线集合,通过修改现有投影的参数并强制触发重绘来实现。具体代码如下:
from pylab import * import cartopy.crs as ccrs from matplotlib.animation import FuncAnimation lon, lat = meshgrid( (linspace(-180,180,361)+0.5)[::4], (linspace(-90,90,181)+0.5)[::4], ) h = (abs(lon)<20).astype(int) * (abs(lat)<10).astype(int) fig = figure(figsize=(3,3)) # 初始化Orthographic投影实例并保存 proj = ccrs.Orthographic(central_longitude=0) ax = fig.add_subplot(1, 1, 1, projection=proj) # 绘制一次等高线并保存集合对象 contour_collection = ax.contourf(lon, lat, h, transform=ccrs.PlateCarree()) ax.set_global() # 确保视图显示完整地球 def update_fig(t): # 修改现有投影的中心经度,而非重新创建投影 proj._central_longitude = t # 标记轴为"待重绘",触发matplotlib重新计算投影位置 ax.stale = True return ax, ani = FuncAnimation( fig, update_fig, frames=linspace(0, 360, 13)[:-1], interval=100, blit=False, ) ani.save('mwe.gif')
关键说明
- 复用等高线集合:只调用一次
contourf(),避免重复计算高成本的数据可视化步骤。 - 修改投影参数而非替换投影:直接修改已绑定投影实例的
_central_longitude属性,让现有图形元素自动适配新的投影视角。 - 强制触发重绘:设置
ax.stale = True会告诉matplotlib,轴的状态已改变,需要重新渲染所有元素,从而实现地球旋转的动画效果。
内容的提问来源于stack exchange,提问作者Mathieu
相关产品推荐
相关产品推荐

