Cartopy简单动画的制作方法

How to do Cartopy simple animations

我正在尝试使用 Cartopy 创建一个简单的动画。基本上只是在地图上画几条线。到目前为止,我正在尝试以下操作:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import matplotlib.animation as animation
import numpy as np

ax = plt.axes(projection=ccrs.Robinson())
ax.set_global()
ax.coastlines()

lons = 10 * np.arange(1, 10)
lats = 10 * np.arange(1, 10)

def animate(i):

    plt.plot([lons[i-1], lons[i]], [lats[i-1], lats[i]], color='blue', transform=ccrs.PlateCarree())
    return plt

anim = animation.FuncAnimation(plt.gcf(), animate, frames=np.arange(1, 8), init_func=None, interval=2000, blit=True)

plt.show()

有谁知道为什么这不起作用?

我猜这与 cartopy 无关。问题是你不能从动画函数中 return pyplot。 (这就像你不买一本书,而是买下整个书店,然后想知道为什么你不能在书店读书。)

最简单的解决方案是关闭 blitting:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

fig, ax = plt.subplots()

lons = 10 * np.arange(1, 10)
lats = 10 * np.arange(1, 10)

def animate(i):
    plt.plot([lons[i-1], lons[i]], [lats[i-1], lats[i]], color='blue')

anim = animation.FuncAnimation(plt.gcf(), animate, frames=np.arange(1, 8), 
                               init_func=None, interval=200, blit=False)

plt.show()

如果出于某种原因你需要 blitting(如果动画太慢或消耗太多 CPU 就会出现这种情况),你需要 return 你想要的 Line2D 对象列表画画。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

fig, ax = plt.subplots()

lons = 10 * np.arange(1, 10)
lats = 10 * np.arange(1, 10)
lines = []

def animate(i):
    line, = plt.plot([lons[i-1], lons[i]], [lats[i-1], lats[i]])
    lines.append(line)
    return lines

anim = animation.FuncAnimation(plt.gcf(), animate, frames=np.arange(1, 8), 
                               interval=200, blit=True, repeat=False)

plt.xlim(0,100) #<- remove when using cartopy
plt.ylim(0,100)
plt.show()