Jupyter Notebook中Matplotlib多子图动画报错求助:解决RuntimeError
解决Matplotlib FuncAnimation多子图动画的RuntimeError问题
我明白你遇到的问题了——当设置blit=True时,FuncAnimation要求动画函数必须返回要更新的Artist对象序列,但你原来的run函数只是重复绘制子图和图像,没有返回任何符合要求的对象,所以触发了那个错误。
问题根源
blit=True的作用是只更新画面中变化的部分,提升动画效率,但这要求你明确告诉Matplotlib哪些元素需要更新。你原来的代码每次调用run都重新创建子图和绘制图像,不仅效率低,还没法返回可追踪的Artist对象。
修复方案
正确的做法是提前初始化所有子图和图像对象,然后在run函数里只更新图像的数据,最后返回这些需要更新的对象列表。具体修改如下:
import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np # 假设x、y、z是已经定义好的三维数组,这里模拟测试数据 rows, cols, frames = 100, 100, 10 x = np.random.rand(rows, cols, frames) y = np.random.rand(rows, cols, frames) z = np.random.rand(rows, cols, frames) fig = plt.figure() # 提前创建三个子图 ax1 = plt.subplot(131) ax2 = plt.subplot(132) ax3 = plt.subplot(133) # 初始化图像对象,保存返回的AxesImage实例 im1 = ax1.imshow(x[:, :, 0], cmap='gray') im2 = ax2.imshow(y[:, :, 0], cmap='gray') im3 = ax3.imshow(z[:, :, 0], cmap='gray') # 一次性设置好标题、刻度等静态元素,不用在run里重复设置 for ax, title in zip([ax1, ax2, ax3], ['original', 'original 2', 'original_3']): ax.set_title(title) ax.set_xticks([]) ax.set_yticks([]) def run(it): # 只更新图像的数据,不重新创建imshow对象 im1.set_data(x[:, :, it]) im2.set_data(y[:, :, it]) im3.set_data(z[:, :, it]) # 返回需要更新的Artist对象列表 return [im1, im2, im3] ani = animation.FuncAnimation(fig, run, frames=np.arange(0, 10), interval=30, blit=True) # ani.save('mwe.mp4') plt.show()
额外说明
如果你的标题需要随帧动态变化,可以提前保存标题对象,然后在run里更新并加入返回列表:
# 初始化时保存标题对象 title1 = ax1.set_title('original frame 0') title2 = ax2.set_title('original 2 frame 0') title3 = ax3.set_title('original_3 frame 0') def run(it): im1.set_data(x[:, :, it]) im2.set_data(y[:, :, it]) im3.set_data(z[:, :, it]) # 更新标题文本 title1.set_text(f'original frame {it}') title2.set_text(f'original 2 frame {it}') title3.set_text(f'original_3 frame {it}') # 把标题也加入返回列表 return [im1, im2, im3, title1, title2, title3]
这样修改后,动画就能正常运行,而且效率比原来的代码高很多,因为避免了重复创建子图和绘图元素。
内容的提问来源于stack exchange,提问作者a_parida
相关产品推荐
相关产品推荐

