Обновление диапазонов осей y для каждого графика в анимации matplotlib

#python #matplotlib #animation

#python #matplotlib #Анимация

Вопрос:

У меня есть 20 файлов, которые я хотел бы отобразить, как показано ниже, а затем показывать один за другим, напоминая анимацию. Один данный график выглядит так, как показано на рисунке. введите описание изображения здесь

20 графиков имеют разные диапазоны для своей оси y. Итак, в то время как показанный на рисунке выше диапазон от -184000 до -176000, другой может варьироваться от -160000 до -170000. Сохранение постоянной оси в диапазоне минимального и максимального значений всех графиков приводит к тому, что графики слишком растягиваются или сжимаются.

Я написал следующий код:

 import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig = plt.figure()
ims = []
for i in range(1, 21):
    file_out = "out"   "_"   str(i)
    outfile = pd.read_table(file_out, 
    skip_blank_lines=True, skipinitialspace=True, sep='s ')
    x = outfile['col1']
    y = outfile['col2']
    im = plt.plot(x, y)
    ims.append(im)

ani = animation.ArtistAnimation(fig, ims, repeat=False, interval = 500)
plt.show()
 

Есть ли способ изменить диапазоны осей для каждого нового графика в анимации?
Я попытался добавить следующую строку в код, но мне это не удалось:
plt.axes(xlim = (0, 100), ylim = (min(y), max(y)))

Спасибо!

Ответ №1:

При использовании ArtistAnimation все линии наносятся на одни и те же оси и переключаются видимыми / невидимыми в каждом кадре, поэтому все они имеют одинаковый масштаб. Чтобы получить желаемый результат, я думаю, вам нужно использовать FuncAnimation вместо ArtistAnimation .

Что-то вроде этого (непроверенное):

 import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()

def animate(i):
    file_out = "out"   "_"   str(i)
    outfile = pd.read_table(file_out,
                            skip_blank_lines=True, skipinitialspace=True, sep='s ')
    x = outfile['col1']
    y = outfile['col2']
    plt.cla()
    im = plt.plot(x, y)
    return im

ani = animation.FuncAnimation(fig, animate, frames=range(1,21), repeat=False, interval = 500)
plt.show()