如果第一帧中的所有条目都相同,则不显示matplotlib图像动画

时间:2016-04-01 19:56:40

标签: python animation matplotlib blit

如果初始帧中的所有条目都包含相同的值,我似乎无法获得图像的TimedAnimation动画来显示任何内容。例如,如果指示的行仍然被注释掉,则以下内容不显示任何内容。更改第一帧以包含np.ones(self.shape)也不会产生任何影响。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as anim

class MyAnimation(anim.TimedAnimation):
    def __init__(self):
        fig = plt.figure()
        self.shape = (10, 10)
        data = np.zeros(self.shape)
        # data.flat[0] = 1 # uncomment this to get the animation to display         
        self.ax = plt.imshow(data)
        super(self.__class__, self).__init__(fig, interval=50, blit=True)

    def _draw_frame(self, framedata):
        data = np.random.rand(*self.shape)
        self.ax.set_data(data)

    def new_frame_seq(self):
        return iter(range(100))

ani = MyAnimation()

关闭blitting似乎没有任何效果。改变后端似乎也没有任何区别;我尝试了Qt4Agg和nbagg(后者通过Jupyter笔记本4.1.0)得到了相同的结果。我使用numpy 1.10.4和matplotlib 1.5.1和Python 2.7.11。

是否有预期的上述行为?如果没有,当第一帧是空白或实心图像时,我是否应该采取措施让动画显示?

1 个答案:

答案 0 :(得分:1)

设置数据不会重新计算颜色限制。在所有输入值相同的情况下,min / max被自动缩放到相同的值,因此您永远不会看到数据被更新。您可以在init

上明确设置限制
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as anim

class MyAnimation(anim.TimedAnimation):
    def __init__(self, ax=None):
        if ax is None:
            fig, ax = plt.subplots()

        self.shape = (10, 10)
        data = np.zeros(self.shape)
        self.im = ax.imshow(data, vmin=0, vmax=1)
        super(self.__class__, self).__init__(ax.figure, interval=50, blit=True)

    def _draw_frame(self, framedata):
        data = np.random.rand(*self.shape)
        self.im.set_data(data)

    def new_frame_seq(self):
        return iter(range(100))

ani = MyAnimation()

或在self.im.set_clim方法中使用_draw_frame

我也不确定子类TimedAnimation是否是您尝试做的最简单方法(FuncAnimation非常灵活)。