2012-06-10 16 views
6

Ho uno strano errore che non riesco a risolvere senza il tuo aiuto. Dopo aver impostato un'immagine con imshow in matplotlib, rimane sempre la stessa anche se la cambio con il metodo set_data. Basta dare un'occhiata a questo esempio:Matplotlib: nessun effetto di set_data in imshow per la trama

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() 

Dopo che ho tracciarla, il metodo set_data non cambia nulla all'interno della trama. Qualcuno può spiegarmi perché?

EDIT

appena aggiunto un paio di righe per sottolineare quello che in realtà voglio fare. Voglio ridisegnare i dati dopo aver premuto un pulsante del mouse. Non voglio cancellare l'intera figura, perché sarebbe stupido se cambiasse solo una cosa.

+0

Solo un bordo avrebbe un altro colore. – ahelm

+0

Dove stai chiamando 'newevent'? – Levon

+0

scusa. ho dimenticato di copiarlo – ahelm

risposta

2

Questo ti dà l'output che ti aspetti?

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() 

Quando visualizzo la trama due volte (una volta prima della modifica haha, e alla fine), lo fa cambiare.

+0

Ho cambiato lo snippet di codice per indicare cosa voglio avere – ahelm

+0

@PateToni Non vedo dove stai chiamando 'newevent' - la mia risposta non ha risolto il tuo problema? – Levon

+0

Lo risolverà, ma imporrà una trama aggiuntiva. Che consumano sempre più memoria ogni volta che tracciate un nuovo 'imshow'. – ahelm

12

Il problema è dovuto al fatto che non è stato aggiornato il ridimensionamento dei pixel dopo la prima chiamata.

Quando si instanzia imshow, imposta vmin e vmax dai dati iniziali e non lo tocca mai più. Nel codice, imposta sia vmin e vmax a 0, poiché i dati, haha = zeros((2,2)), sono zero ovunque.

Il nuovo evento deve includere la scalabilità automatica con img.autoscale() o impostare in modo esplicito nuovi termini di ridimensionamento impostando img.norm.vmin/vmax in base alle proprie preferenze.

+1

Grazie! Questo ha funzionato per me. =) –

Problemi correlati