我有一个在需要时导入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似乎也要求我知道先验帧之间的时间间隔,我不知道它并且不一定是常数。
答案 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()