2012-06-10 13 views
6

Tengo un extraño error que no puedo solucionar sin su ayuda. Después de configurar una imagen con imshow en matplotlib, permanece igual todo el tiempo incluso si la cambio con el método set_data. Basta con echar un vistazo en este ejemplo:Matplotlib: no hay efecto de set_data en imshow para el gráfico

import numpy as np 
from matplotlib import pyplot as plt 


def newevent(event): 
    haha[1,1] += 1 
    img.set_data(haha) 
    print img.get_array() # the data is change at this point 
    plt.draw() 

haha = np.zeros((2,2)) 
img = plt.imshow(haha) 
print img.get_array()  # [[0,0],[0,0]] 
plt.connect('button_press_event', newevent) 
plt.show() 

Después de marcarlo, el método set_data no cambia nada en el interior de la parcela. ¿Puede alguien explicarme por qué?

EDITAR

acaba de añadir unas pocas líneas para señalar lo que realmente quiero hacer. Quiero volver a dibujar los datos después de presionar el botón del mouse. No quiero borrar toda la figura, porque sería estúpido si solo cambia una cosa.

+0

Solo uno de los bordes tendría otro color. – ahelm

+0

¿A dónde llamas 'newevent'? – Levon

+0

lo siento. Olvidé copiarlo. – ahelm

Respuesta

2

¿Esto le da la salida que espera?

import numpy as np 
from matplotlib import pyplot as plt 

haha = np.zeros((2,2)) 
img = plt.imshow(haha) 
print img.get_array()  # [[0,0],[0,0]] 
haha[1,1] += 1 

img.set_data(haha)  
img = plt.imshow(haha)  # <<------- added this line 
print img.get_array()  # [[0,0],[0,1]] 
plt.show() 

Cuando puedo mostrar la parcela dos veces (una vez antes del cambio a haha, y al final), sí cambia.

+0

Cambié el fragmento de código para señalar lo que quiero tener – ahelm

+0

@PateToni No veo a dónde llama 'newevent' - ¿Mi respuesta no resolvió su problema? – Levon

+0

Lo resolverá, pero forzará una trama adicional. Que consume más y más memoria cada vez que traza un nuevo 'imshow'. – ahelm

12

El problema se debe a que no ha actualizado la escala de píxeles después de la primera llamada.

Al crear instancia imshow, establece vmin y vmax a partir de los datos iniciales, y nunca vuelve a tocarlo. En su código, establece vmin y vmax en 0, ya que sus datos, haha = zeros((2,2)), son cero en todas partes.

Su nuevo evento debe incluir autoescalado con img.autoscale(), o establece explícitamente nuevos términos de escalamiento configurando img.norm.vmin/vmax a algo que prefiera.

+1

Gracias! Esto funcionó para mí. =) –

Cuestiones relacionadas