Saltar al contenido

¿Cómo actualizar la ventana imshow () de matplotlib de forma interactiva?

Solución:

No necesitas llamar imshow todo el tiempo. Es mucho más rápido usar el objeto set_data método:

myobj = imshow(first_image)
for pixel in pixels:
    addpixel(pixel)
    myobj.set_data(segmentedimg)
    draw()

los draw() debe asegurarse de que el backend actualice la imagen.

ACTUALIZAR: su pregunta se modificó significativamente. En tales casos, es mejor hacer otra pregunta. Aquí hay una forma de abordar su segunda pregunta:

La animación de Matplotlib solo se ocupa de una dimensión creciente (tiempo), por lo que su ciclo doble no funcionará. Necesita convertir sus índices a un solo índice. Aquí hay un ejemplo:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

nx = 150
ny = 50

fig = plt.figure()
data = np.zeros((nx, ny))
im = plt.imshow(data, cmap='gist_gray_r', vmin=0, vmax=1)

def init():
    im.set_data(np.zeros((nx, ny)))

def animate(i):
    xi = i // ny
    yi = i % ny
    data[xi, yi] = 1
    im.set_data(data)
    return im

anim = animation.FuncAnimation(fig, animate, init_func=init, frames=nx * ny,
                               interval=50)

Si está utilizando Jupyter, tal vez esta respuesta le interese. Leí en este sitio que la función incorporada de clear_output puede hacer el truco:

%matplotlib inline
from matplotlib import pyplot as plt
from IPython.display import clear_output

plt.figure()
for i in range(len(list_of_frames)):
    plt.imshow(list_of_frames[i])
    plt.title('Frame %d' % i)
    plt.show()
    clear_output(wait=True)

Es cierto que este método es bastante lento, pero se puede utilizar con fines de prueba.

Implementé un práctico script que se adapta a sus necesidades. Pruébalo aquí

Un ejemplo que muestra imágenes en un directorio personalizado es el siguiente:

  import os
  import glob
  from scipy.misc import imread

  img_dir="YOUR-IMAGE-DIRECTORY"
  img_files = glob.glob(os.path.join(video_dir, '*.jpg'))

  def redraw_fn(f, axes):
    img_file = img_files[f]
    img = imread(img_file)
    if not redraw_fn.initialized:
      redraw_fn.im = axes.imshow(img, animated=True)
      redraw_fn.initialized = True
    else:
      redraw_fn.im.set_array(img)
  redraw_fn.initialized = False

  videofig(len(img_files), redraw_fn, play_fps=30)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *