2011-04-10 11 views
6

Prácticamente no tengo experiencia con python, pero estoy tratando de crear un script simple que cargue una imagen y use el control deslizante para ajustar el mínimo y máximo de la barra de colores, y vuelva a dibujar los datos de imagen en consecuencia.Usando el control deslizante matplotlib para cambiar clim en la imagen

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

objeto 'AxesImage' no es Iterable

No entiendo lo esta llamada sí lo hace, pero aparentemente no se puede usar con imshow(). Si elimino la coma en esa llamada, no obtengo 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() 

Respuesta

7

En su mayoría, que acaba de tener montones y montones de problemas de sintaxis.

Por ejemplo, usted estaba tratando de descomprimir un único valor (im1,=ax.imshow(im)) que le da el TypeError que mencionó en su pregunta (como debería). También estableces una función a un valor cuando querías llamarlo: (im1.set_clim=(smin.val,smax.val)).

Además, eliminé el from pylab import * de su ejemplo. Esto está bien para el uso interactivo, pero por favor, por favor, no lo use para el código real. Hace que sea muy difícil saber de dónde provienen las funciones que está llamando (y el espacio de nombres de pylab, en particular, es enorme por diseño. Se debe usar solo para uso interactivo o scripts rápidos de un solo uso.)

Aquí está un ejemplo de trabajo (utilizando 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() 
1

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 va a ser algo iterable (usualmente una tupla cuando usarías 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 está poniendo en Python im1 sin comprobar (pero a partir de su pregunta me da la impresión de que escribir im1,=... obras mientras im1=... no lo hace), pero usted sospecha no logra dibujar la imagen por alguna razón. ¿Se llama realmente al update? Si lo hace, tal vez intente con im1.draw().

Cuestiones relacionadas