试图让matplotlib将图像显示为动画

时间:2018-01-25 14:17:44

标签: python-3.x matplotlib

我有一个在需要时导入matplotlib的类,它作为一个接收NumPy数组的回调函数,应该在下一个渲染帧中显示。我需要在屏幕上将其作为动画转储到窗口中。目前的代码是:

import matplotlib.pyplot as plt
import numpy as np

class Renderer(object):
    def __init__(self):
        self._image = None

    def __call__(self, buffer):
        if not self._image:
            self._image = plt.imshow(buffer, animated=True)
        else:
            self._image.set_data(buffer)
        plt.draw()

renderer = Renderer()
for _ in range(100):
    renderer(
        np.random.randint(low=0, high=255, size=(240, 320, 3), dtype=np.uint8))

有一些非常繁重的计算正在进行模拟生成每个帧,所以我不担心帧速率太高。

目前,代码绝对没有任何内容,即屏幕上没有任何内容。有没有人知道如何用库做动画?

更新:关于上下文,所以在我的用例中,Renderer的一个实例被传递给生成像素的代码层,并通过调用Renderer对象在屏幕上绘制它们。换句话说,当应该绘制的东西不受我的控制时,我也无法控制帧速率并且不知道帧之间的时间间隔。出于这个原因,从API观点来看,我真正需要的只是一种在屏幕上转储一堆像素的方法。

FuncAnimation方法存在的问题是,获取帧需要更改Renderer回调以将帧放在队列中,生成帧的生成器将从中拉出帧。 FuncAnimation似乎也要求我知道先验帧之间的时间间隔,我不知道它并且不一定是常数。

1 个答案:

答案 0 :(得分:1)

与动画一样,使用交互模式(plt.ion())或FuncAnimation

交互模式(plt.ion()

import matplotlib.pyplot as plt
import numpy as np

class Renderer(object):
    def __init__(self):
        self._image = None

    def __call__(self, buffer):
        if not self._image:
            self._image = plt.imshow(buffer, animated=True)
        else:
            self._image.set_data(buffer)
        plt.pause(0.01)
        plt.draw()

renderer = Renderer()
plt.ion()
for _ in range(100):
    renderer(
        np.random.randint(low=0, high=255, size=(240, 320, 3), dtype=np.uint8))
plt.ioff()
plt.show()

FuncAnimaton

的动画
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np

class Renderer(object):
    def __init__(self):
        self._image = None

    def __call__(self, buffer):
        if not self._image:
            self._image = plt.imshow(buffer, animated=True)
        else:
            self._image.set_data(buffer)


renderer = Renderer()

fig, ax = plt.subplots()
def update(i):
    renderer(
        np.random.randint(low=0, high=255, size=(240, 320, 3), dtype=np.uint8))
ani = FuncAnimation(fig, update, frames=100, interval=10)

plt.show()