Usando el widget deslizante matplotlib para cambiar el clima en la imagen

Prácticamente no tengo experiencia con python, pero estoy tratando de crear un script simple que carga una imagen y usa el control deslizante para ajustar el mínimo y el máximo de la barra de colores, y vuelve a dibujar los datos de la imagen como corresponde.

Estoy tratando de seguir este ejemplo: http://matplotlib.sourceforge.net/examples/widgets/slider_demo.html . Intenté simplemente cambiar el comando de la ttwig para mostrar, y usar los valores del control deslizante para establecer el clima de mi imagen. Sin embargo, recibo el siguiente mensaje de error, de la llamada ‘im1, = ax.imshow’ (en la línea 12 en el código siguiente):

El objeto ‘AxesImage’ no es iterable.

No entiendo qué hace esta llamada, pero aparentemente no se puede usar con imshow (). Si elimino la coma en esa llamada, no aparece ningún error, pero la imagen no se actualiza cuando se cambian los controles deslizantes. ¿Alguien tiene una solución alternativa o una explicación de por qué esto no funciona? Cualquier ayuda sería apreciada, gracias.

Mi código es el siguiente:

from pylab import * from matplotlib.widgets import Slider, Button, RadioButtons import matplotlib.pyplot as plt import numpy as np close('all') ax = subplot(111) subplots_adjust(left=0.25, bottom=0.25) min0 = 0 max0 = 25000 im=np.loadtxt('im.txt') im1,=ax.imshow(im) colorbar() axcolor = 'lightgoldenrodyellow' axmin = axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor) axmax = axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor) smin = Slider(axmin, 'Min', 0, 30000, valinit=min0) smax = Slider(axmax, 'Max', 0, 30000, valinit=max0) def update(val): im1.set_clim=(smin.val,smax.val) draw() smin.on_changed(update) smax.on_changed(update) show() 

Sobre todo, acabas de tener muchos y muchos problemas de syntax.

Por ejemplo, estaba intentando desempaquetar un solo valor ( im1,=ax.imshow(im) ) dándole el TypeError que mencionó en su pregunta (como debería). También estableció una función en un valor cuando pretendía llamarlo: ( im1.set_clim=(smin.val,smax.val) ).

Además, from pylab import * de tu ejemplo. Esto está bien para uso interactivo, pero, por favor, no lo use para el código real. Esto hace que sea muy difícil saber de dónde provienen las funciones a las que llama (y el espacio de nombres de Pylab, en particular, tiene un gran diseño. Solo se debe usar para uso interactivo o scripts de un solo uso rápido)

Aquí hay un ejemplo de trabajo (usando datos aleatorios):

 import matplotlib.pyplot as plt import numpy as np from matplotlib.widgets import Slider, Button, RadioButtons fig = plt.figure() ax = fig.add_subplot(111) fig.subplots_adjust(left=0.25, bottom=0.25) min0 = 0 max0 = 25000 im = max0 * np.random.random((10,10)) im1 = ax.imshow(im) fig.colorbar(im1) axcolor = 'lightgoldenrodyellow' axmin = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor) axmax = fig.add_axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor) smin = Slider(axmin, 'Min', 0, 30000, valinit=min0) smax = Slider(axmax, 'Max', 0, 30000, valinit=max0) def update(val): im1.set_clim([smin.val,smax.val]) fig.canvas.draw() smin.on_changed(update) smax.on_changed(update) plt.show() 

Según la documentación, imshow devuelve un objeto `matplotlib.image.AxesImage ‘. Cuando pones esa coma, Python asume que el tipo de retorno de la función será algo iterable (generalmente una tupla cuando estarías usando esta construcción, pero no necesariamente) porque Python te permite escribir código como este:

 a = my_function() # a = (c, d) a, b = my_function() # a = c, b = d 

pero

 a, = my_function() # you should get an error 

No estoy del todo seguro de lo que Python pone en im1 sin verificar (pero por su pregunta tengo la impresión de que escribir im1,=... funciona mientras que im1=... no lo hace), pero sospecho que no puede Dibuja la imagen por alguna razón. ¿La update realmente se llama? Si lo hace, tal vez intente im1.draw() lugar.