2016-08-02 4 views
0

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

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

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

ответ

0

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

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

Также отметит, что

#!/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() 

Надеется, что это помогает!

Смежные вопросы