代码之家  ›  专栏  ›  技术社区  ›  old-ufo

如果第一个图像为空,如何使plt.canvas.draw()更新工作?

  •  0
  • old-ufo  · 技术社区  · 6 年前

    下面的代码始终只显示空图像

    %matplotlib tk
    import numpy as np
    import matplotlib.pyplot as pp
    import time
    from copy import deepcopy
    pp.close('all')
    img1 = np.zeros((400,400), dtype = np.uint8)
    new_list = []
    for i in range(100):
        new_list.append(deepcopy(img1).astype(np.uint8))
        new_list[-1][i:i+100,i:i+100] = 255
        if i == 0:
            new_list[-1][i:i+100,i:i+100] = 0 
            #new_list[-1][i,i] = 1 
    if True:
        fig,ax = pp.subplots(1,1)
        image = ax.imshow(new_list[0],animated=True)
        fig.canvas.draw()
        start = time.time()
        tic = start
        for i in range(100):
            if not(i % 10):
                toc = time.time()
                tic = time.time()
            image.set_data(new_list[i])
            fig.canvas.draw()
    

    但是,如果我只是取消对单行的注释

    new_list[-1][i,i] = 1
    

    或者从其他非零图像开始,比如

    image = ax.imshow(np.eye(400, dtype = np.uint8),animated=True)
    

    如图所示更新-显示移动100x100平方。我的问题是:为什么会发生这种情况?如果只从零图像开始,有没有任何方法可以使图形更新工作?

    1 回复  |  直到 6 年前
        1
  •  1
  •   ImportanceOfBeingErnest    6 年前

    如果图像中的初始数组全部为零,则图像将是单色的,即使已更新。为了防止出现这种情况,您可以设置图像的标准化,然后在整个过程中使用。在这种情况下,最大值似乎是255,因此

    ax.imshow(..., vmin=0, vmax=255)
    

    在您的情况下,使用 FuncAnimation :

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.animation import FuncAnimation
    from copy import deepcopy
    
    
    img1 = np.zeros((400,400), dtype = np.uint8)
    new_list = []
    for i in range(100):
        new_list.append(deepcopy(img1).astype(np.uint8))
        new_list[-1][i:i+100,i:i+100] = 255
        if i == 0:
            new_list[-1][i:i+100,i:i+100] = 0 
            new_list[-1][i,i] = 1 
    
    fig,ax = plt.subplots(1,1)
    image = ax.imshow(new_list[0],animated=True, vmin=0, vmax=255)
    
    def animate(i):
        image.set_data(new_list[i])
    
    ani = FuncAnimation(fig, animate, frames=100, interval=10)
    plt.show()