ArtistAnimation использует контур для модельных сюжетов - PullRequest
1 голос
/ 01 мая 2020

ArtistAnimation работает при использовании метода "contourf"? Я пытаюсь создать MP4-анимацию для прогноза модели.

Я использую подход, похожий на тот, который показан в одном из видеороликов MetPy Monday, где вы добавляете сюжеты к пустому исполнителю массив (для радиолокационных участков). Радарные / спутниковые графики, кажется, успешно строят анимацию, потому что они используют «pcolorme sh», но то же самое не относится к модельным графикам, где я использую «contourf».

При выполнении этого кода в JupyterLab

plt.rcParams['animation.html'] = 'jshtml'
anim = ArtistAnimation(fig, artists, interval=100, blit=False)
anim

Я вижу это в конце трассировки стека:

AttributeError: у объекта 'QuadContourSet' нет атрибута 'set_visible'

Старый поток в stackoverflow предпринял попытку решить эту проблему: https://github.com/matplotlib/matplotlib/issues/6139

При реализации этих исправлений ошибка атрибута set_visible больше не появляется, а появляется вместо этого:

AttributeError: объект 'QuadContourSet' не имеет атрибута 'get_figure'

Не уверен, откуда go отсюда. Если есть хорошие новости, я вижу, что все данные с каждого временного шага отображаются одновременно на карте (так что с извлечением данных все в порядке), но что-то не так с ArtistAnimation и как это работает с методом contourf. Любое руководство или полезные советы будут потрясающими!

1 Ответ

0 голосов
/ 02 мая 2020

По причинам, которые я не понимаю, объект, напрямую возвращаемый contour, QuadContourSet, не является Artist, в отличие от многих других команд построения, поэтому у него нет set_visible метод. После небольшого копания, QuadContourSet имеет атрибут .collections, который представляет собой список всех нарисованных коллекций линий, поэтому вы хотите использовать его в чем-то подобном, который модифицирован из примера dynamic_image.py matplotlib:

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

fig, ax = plt.subplots()

def f(x, y):
    return np.sin(x) + np.cos(y)

x = np.linspace(0, 2 * np.pi, 120)
y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)

artists = []
for i in range(60):
    X, Y = np.meshgrid(x, y)
    cs = ax.contour(X, Y, f(x + i * np.pi/15., y + i*np.pi/20))
    artists.append(cs.collections)

ani = animation.ArtistAnimation(fig, artists, interval=50, blit=True,
                                repeat_delay=1000)

plt.show()
...