大多数关于matplotlib项目动画的问题都详细描述了以线条格式绘制数据,这似乎不适用于图像。
我有三个系列的图像,我想在子图中显示,并动画图形显示系列中的每一项。目前,我使用子图创建图形,并在for循环中生成要在动画中显示的图形列表。我使用的是jupyter笔记本,所以我将其导出为jshtml框架。我的代码:
fig, (ax0, ax1, ax2) = plt.subplots(nrows=1, ncols=3,
figsize=(12, 6))
fis = []
for i in range(0,len(filename_list),4): #show every 4th image in series
ax0.set_title('Raw image')
ax0.imshow(plt.imread(filename_list[i]),animated=True)
ax1.set_title('Manually cropped image')
ax1.imshow(plt.imread( (filename_list[i].parent / 'cropped' /filename_list[i].name) ) ,animated=True)
ax2.set_title('Cropped image after re-centering')
ax2.imshow(plt.imread( (filename_list[i].parent / 'cropped_corr' /filename_list[i].name) ) ,animated=True)
fis.append([fig])
ani = animation.ArtistAnimation(fig, fis, interval=500, blit=False, repeat_delay=1000)
plt.close()
HTML(ani.to_jshtml())这会产生一个有效的jshtml动画,但是子情节不会改变。我怎样才能使其动画化,以致于更新子图?我不知道如何制作一个更新每一帧的动画函数。
谢谢!
发布于 2021-10-12 16:53:07
在发布后不久,我重新检查了在动画中只创建一个图像的代码。我突然想到,我需要将每个imshow命令设置为一个添加到图形列表中的变量。代码变成:
fig, (ax0, ax1, ax2) = plt.subplots(nrows=1, ncols=3,
figsize=(12, 6))
fis = []
for i in range(0,len(filename_list),4):
ax0.set_title('Raw image')
im0=ax0.imshow(plt.imread(filename_list[i]),animated=True)
ax1.set_title('Manually cropped image')
im1=ax1.imshow(plt.imread( (filename_list[i].parent / 'cropped' /filename_list[i].name) ) ,animated=True)
ax2.set_title('Cropped image after re-centering')
im2=ax2.imshow(plt.imread( (filename_list[i].parent / 'cropped_corr' /filename_list[i].name) ) ,animated=True)
fis.append([im0,im1,im2])
ani = animation.ArtistAnimation(fig, fis, interval=500, blit=False, repeat_delay=1000)
plt.close()
HTML(ani.to_jshtml())注意,在每个imshow调用中添加了im0、im1和im2,并在fis.append命令中创建了一个列表列表。
发布于 2021-10-12 16:54:06
from IPython.display import clear_output
fis = []
for i in range(0,len(filename_list),4): #show every 4th image in series
fig, (ax0, ax1, ax2) = plt.subplots(nrows=1, ncols=3, figsize=(12, 6), num = 1, clear = True)
ax0.set_title('Raw image')
ax0.imshow(plt.imread(filename_list[i]),animated=True)
ax1.set_title('Manually cropped image')
ax1.imshow(plt.imread( (filename_list[i].parent / 'cropped' /filename_list[i].name) ) ,animated=True)
ax2.set_title('Cropped image after re-centering')
ax2.imshow(plt.imread( (filename_list[i].parent / 'cropped_corr' /filename_list[i].name) ) ,animated=True)
plt.show()
fis.append([fig])
clear_output()
ani = animation.ArtistAnimation(fig, fis, interval=500, blit=False, repeat_delay=1000)
HTML(ani.to_jshtml())https://stackoverflow.com/questions/69544033
复制相似问题