Как создать анимацию, которая циклически повторяет серию картинок matpyplot.pyplot

Я хотел бы преобразовать следующий код в анимацию, которая циклически перебирает значения x, а не просто возвращает одно значение x, как это происходит в настоящее время.

import numpy as np
import matplotlib.pyplot as plt

def sliceplot(file_glob,xslice):
    """User inputs location of binary data file
    and single slice of x axis is returned as plot"""

    data=np.fromfile(file_glob,dtype=np.float32)
    data=data.reshape((400,400,400))
    plt.imshow(data[xslice,:,:])
    plt.colorbar()
    plt.show() 

Я попытался следовать этому примеру, но не могу перевести его на то, что мне нужно: http://matplotlib.org/examples/animation/dynamic_image.html

Любая помощь, которую вы можете предоставить, будет принята с благодарностью.

1 ответ

Это то, что ты любишь делать? Мой пример ниже - на основе этого примера - использует какое-то фиктивное изображение из функции generate_image, определенные в сценарии. Из того, что я понимаю по вашему вопросу, вы бы предпочли загружать новый файл для каждой итерации, что можно сделать, заменив функциональность generate_image, Вы, вероятно, должны использовать массив file_names вместо массива с матрицами данных, как я сделал здесь, но для прозрачности я сделал это таким образом (однако это очень неэффективно для больших наборов данных!).

Кроме того, я также добавил два дополнительных аргумента к FuncAnimation-вызовите, чтобы 1) убедиться, что он останавливается, когда у вас нет изображений (с frames=len(images)) и 2) fargs=[images, ] передать массив изображений в функцию. Вы можете прочитать больше здесь.

Также обратите внимание, что

#!/usr/bin/env python
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

def generate_image(n):
    def f(x, y):
        return np.sin(x) + np.cos(y)
    imgs = []
    x = np.linspace(0, 2 * np.pi, 120)
    y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)
    for i in range(n):
        x += np.pi / 15.
        y += np.pi / 20.
        imgs.append(f(x, y))
    return imgs


images = generate_image(100)

fig, ax = plt.subplots(1, 1)    
im = ax.imshow(images[0], cmap=plt.get_cmap('coolwarm'), animated=True)

def updatefig(i, my_arg):
    im.set_array(my_arg[i])
    return im,

ani = animation.FuncAnimation(fig, updatefig, frames=len(images), fargs=[images, ], interval=50, blit=True)
plt.show()

Пример загрузчика имени файла будет что-то вроде

def load_my_file(filename):
    # load your file!
    ...
    return loaded_array

file_names = ['file1', 'file2', 'file3']

def updatefig(i, my_arg):
    # load file into an array
    data = load_my_file(my_arg[i])  # <<---- load the file in whatever way you like
    im.set_array(data)
    return im,

ani = animation.FuncAnimation(fig, updatefig, frames=len(file_names), fargs=[file_names, ], interval=50, blit=True)
plt.show()

Надеюсь, поможет!

Другие вопросы по тегам