我在此线程上给出了答案,并讨论了matplotlib上的衰落点。我对ImportanceOfBeingErnest的答案感到好奇。因此,我尝试使用他的代码。
首先,这是我的代码。
import numpy as np import matplotlib.pyplot as plt import matplotlib.animation from matplotlib.colors import LinearSegmentedColormap def get_new_vals(): x = 0 y = 0 while True: if x >= .9: x = 0 y = 0 x += .1 y += .1 yield x, y def update(t, x_vals, y_vals, intensity, scatter, gen): # Get intermediate points new_xvals, new_yvals = gen.next() x_vals.extend([new_xvals]) y_vals.extend([new_yvals]) # Put new values in your plot scatter.set_offsets(np.c_[x_vals, y_vals]) # Calculate new color values for index in range(len(intensity)): if intensity[index] < .1: intensity[index] = 0 intensity[index] *= .6 intensity.extend(1 for _ in xrange(len([new_xvals]))) intens_dup = np.array(intensity) """ intensity = np.concatenate((np.array(intensity) * .6, np.ones(len(new_xvals)))) """ scatter.set_array(intens_dup) # Set title axis.set_title('Time: %0.3f' % t) def anim_random_points(fig, axis): x_vals = [] y_vals = [] intensity = [] iterations = 100 colors = [ [0, 0, 1, 0], [0, 0, 1, 0.5], [0, 0.2, 0.4, 1] ] cmap = LinearSegmentedColormap.from_list("", colors) scatter = axis.scatter(x_vals, y_vals, c=[], cmap=cmap, vmin=0, vmax=1) gen_values = get_new_vals() ani = matplotlib.animation.FuncAnimation(fig, update, frames=iterations, interval=50, fargs=(x_vals, y_vals, intensity, scatter, gen_values), repeat=False) # Position 1 for plt.show() plt.show() if __name__ == '__main__': fig, axis = plt.subplots() axis.set_xlabel('X Axis', size = 12) axis.set_ylabel('Y Axis', size = 12) axis.axis([0,1,0,1]) anim_random_points(fig, axis) # Position 2 for plt.show() # plt.show()
然后,我注意到了一件奇怪的事。至少对于我来说。注意Position 1和Position 2(在代码末尾)。位置1放置在animation函数之后,另一个放置 在 代码 后 ,因为函数在位置1之后结束,因此转到位置2。
Position 1
Position 2
animation
由于FuncAnimation需要figure运行动画,所以我想知道为什么plt.show()在位置1而不是位置2上可以工作。
FuncAnimation
figure
plt.show()
该matplotlib文档约州FuncAnimation
保留对实例对象的引用至关重要。动画由计时器(通常来自主机GUI框架)推进,该动画对象持有唯一的引用。如果不保留对Animation对象的引用,则将对其进行垃圾回收(并因此而对计时器进行引用),这将停止动画。
如果将其放置plt.show()在anim_random_points函数之外,则将ani保留垃圾内容,该变量保留了对动画的引用,并且将不再显示动画。
anim_random_points
ani
这种情况的解决方案是从该函数返回动画
def anim_random_points(fig, axis): # ... ani = matplotlib.animation.FuncAnimation(...) return ani if __name__ == '__main__': # ... ani = anim_random_points(...) plt.show()