【问题标题】:Animating a figure of subplots of multiple image series动画化多个图像系列的子图
【发布时间】:2021-10-13 00:54:05
【问题描述】:

关于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 动画,但子图不会改变。 如何制作动画以更新子图?我不知道如何制作一个更新每一帧的动画函数。

谢谢!

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    发布后不久,我重新检查了在动画中仅创建一个图像的代码。我突然想到,我需要将每个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 调用中添加im0im1im2,并在fis.append 命令中创建列表列表。

    【讨论】:

      【解决方案2】:
      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())
      

      【讨论】: