如何做Cartopy简单的动画

时间:2017-03-09 09:13:07

标签: python-3.x matplotlib cartopy

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

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

1 个答案:

答案 0 :(得分:1)

这与卡车无关,我猜。问题是你不能从动画函数返回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就会出现这种情况),你需要返回你想要绘制的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()