如何创建一个循环通过一系列matpyplot.pyplot imshows的动画

时间:2016-08-02 04:00:05

标签: python animation matplotlib imshow

我想将以下代码转换为循环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 个答案:

答案 0 :(得分:0)

你喜欢这样的事吗?我的下面示例 - 基于this示例 - 使用了脚本中定义的函数generate_image中的一些虚拟图像。根据我对您的问题的理解,您宁愿为每次迭代加载一个新文件,这可以通过替换generate_image的功能来完成。您应该使用file_names数组而不是数据矩阵数组,就像我在这里所做的那样,但是为了透明,我这样做了(但是对于大型数据集来说它是非常低效的。)。

此外,我还在FuncAnimation - 调用中添加了两个额外的参数,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()

希望它有所帮助!