【问题标题】:Plot a sequence of images with matplotlib Python使用 matplotlib Python 绘制一系列图像
【发布时间】:2012-04-10 07:33:48
【问题描述】:

我正在 Python 中实现 kmeans 聚类算法。我想在每次迭代中绘制集群质量的状态(图像)。所以,基本上我有一个循环,它在每次迭代时绘制一个图像,我想对此进行动画处理。我不知道我是否说清楚了。目前我只使用 show() 命令绘制图像,但我必须关闭它才能继续迭代。

那么,有什么方法可以为每一步计算的图像序列设置动画吗?

【问题讨论】:

    标签: python graphics matplotlib cluster-analysis


    【解决方案1】:

    我已经实现了一个可能有用的图像序列可视化实用程序。试试看here

    以下是绘制动态正弦波的示例。

    import numpy as np
    
    def redraw_fn(f, axes):
        amp = float(f) / 3000
        f0 = 3
        t = np.arange(0.0, 1.0, 0.001)
        s = amp * np.sin(2 * np.pi * f0 * t)
        if not redraw_fn.initialized:
            redraw_fn.l, = axes.plot(t, s, lw=2, color='red')
            redraw_fn.initialized = True
        else:
            redraw_fn.l.set_ydata(s)
    
    redraw_fn.initialized = False
    
    num_time_steps = 100
    videofig(num_time_steps, redraw_fn)
    

    【讨论】:

      【解决方案2】:

      使用pause()。对于存储在video[t, x, y] 中的一组图像,这会制作一个简单的动画:

      import matplotlib.pyplot as plt
      for i in range(video.shape[0]):
          plt.imshow(video[i,:,:])
          plt.pause(0.5)
      

      【讨论】:

      • 这仅显示我的情况下循环的最后一张图片
      • 现在可以了!我必须添加 %matplotlib qt 才能使 python 绘图进入外部窗口。这个答案也令人耳目一新
      【解决方案3】:

      我尝试了ion() 方法,它适用于少量数据,但如果您有大图像或相对较快的图像流,这种方法非常慢。据我了解,ion() 会在您每次更改图形时重新绘制所有内容,包括轴和标签等。这可能不是您想要的。

      This thread 展示了一种更好的做事方式

      这是我制作的一个简单示例,展示了如何执行此操作:

      import time
      import numpy
      import matplotlib.pyplot as plt
      
      
      fig = plt.figure( 1 )
      ax = fig.add_subplot( 111 )
      ax.set_title("My Title")
      
      im = ax.imshow( numpy.zeros( ( 256, 256, 3 ) ) ) # Blank starting image
      fig.show()
      im.axes.figure.canvas.draw()
      
      tstart = time.time()
      for a in xrange( 100 ):
        data = numpy.random.random( ( 256, 256, 3 ) ) # Random image to display
        ax.set_title( str( a ) )
        im.set_data( data )
        im.axes.figure.canvas.draw()
      
      print ( 'FPS:', 100 / ( time.time() - tstart ) )
      

      使用上面的代码,我的机器上大约有 30 FPS。当我使用 plt.ion()ax.imshow( data ) 而不是 im.axes.figure.canvas.draw()im.set_data( data ) 运行相同的东西时,我得到大约 1 FPS

      【讨论】:

        【解决方案4】:

        只需启用交互模式:

        ion()
        show()
        

        它会起作用的。这有点奇怪。但请记住:在 Python 脚本结束时,它会关闭窗口。你必须打电话

        ion()
        show()
        

        在脚本结束时,如果您不想关闭窗口。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-31
          • 2019-04-13
          • 1970-01-01
          • 2017-06-07
          • 1970-01-01
          • 2018-06-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多