You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')
关键说明
  1. 复用等高线集合:只调用一次contourf(),避免重复计算高成本的数据可视化步骤。
  2. 修改投影参数而非替换投影:直接修改已绑定投影实例的_central_longitude属性,让现有图形元素自动适配新的投影视角。
  3. 强制触发重绘:设置ax.stale = True会告诉matplotlib,轴的状态已改变,需要重新渲染所有元素,从而实现地球旋转的动画效果。

内容的提问来源于stack exchange,提问作者Mathieu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:45:33