Как сделать 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()
Кто-нибудь знает, почему это не работает?
2 ответа
Я полагаю, это не имеет отношения к картопии. Проблема в том, что вы не можете вернуть pyplot из функции анимации. (Это как если бы вместо покупки книги вы купили бы весь книжный магазин, а потом удивлялись, почему вы не можете читать книжный магазин.)
Самое простое решение - отключить блиттинг:
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()
Если по какой-то причине вам нужно блиттинг (что было бы в случае, если анимация слишком медленная или потребляет слишком много ресурсов ЦП), вам нужно вернуть список объектов 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()
Предупреждение
Функция анимации должна возвращать последовательность объектов Artist.
Так что просто изменитеblit
ключевое слово изTrue
кfalse
а затем сохранить анимацию в файл GIF может решить эту проблему.
В противном случае вы можете построить последовательность объектов Artist, а затем установитьblit=True
следующее:
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):
line = ax.plot([lons[i-1], lons[i]], [lats[i-1], lats[i]], color='blue', transform=ccrs.PlateCarree())
return line
anim = animation.FuncAnimation(plt.gcf(), animate, frames=np.arange(1, 8), init_func=None, interval=200, blit=True)
anim.save('test.gif')
plt.show()
Пусть это поможет вам.