2012-06-10 13 views
6

Mam dziwny błąd, którego nie mogę naprawić bez twojej pomocy. Po ustawieniu obrazu z imshow w matplotlib pozostaje on cały czas taki sam, nawet jeśli zmieniam go za pomocą metody set_data. Wystarczy spojrzeć na ten przykład:Matplotlib: brak efektu set_data w imshow dla działki

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

Po wykreślić go, metoda set_data niczego nie zmieni wewnątrz działki. Czy ktoś może mi wyjaśnić, dlaczego?

EDIT

Wystarczy dodaje kilka linii, aby podkreślić to, co rzeczywiście chcesz zrobić. Chcę przerysować dane po naciśnięciu przycisku myszy. Nie chcę usunąć całej liczby, bo byłoby głupio, gdyby tylko jedna rzecz się zmieniła.

+0

Tylko jeden brzeg miałby inny kolor. – ahelm

+0

Gdzie nazywasz 'newevent'? – Levon

+0

Przepraszam. zapomniałem go skopiować. – ahelm

Odpowiedz

2

Czy to daje oczekiwaną wydajność?

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

Kiedy wyświetlić wykres dwukrotnie (raz przed zmianą haha, a na końcu), to nie zmienia.

+0

Zmieniłem fragment kodu, aby wskazać, co chcę mieć. – ahelm

+0

@PateToni Nie widzę miejsca, do którego dzwonisz 'newevent' - czy moja odpowiedź nie rozwiązała twojego problemu? – Levon

+0

To rozwiąże, ale wymusi dodatkowy wątek. Które zużywają coraz więcej pamięci za każdym razem, gdy kreślisz nowe "imshow". – ahelm

12

Problem polega na tym, że nie zaktualizowano skalowania pikseli po pierwszym wywołaniu.

Gdy tworzysz instancję imshow, ustawia ona vmin i vmax z danych początkowych i nigdy nie dotyka go ponownie. W twoim kodzie ustawia on zarówno vmin i vmax na 0, ponieważ twoje dane, haha = zeros((2,2)), są wszędzie równe zero.

Twoje nowe wydarzenie powinno zawierać autoskalowanie z img.autoscale() lub jawnie ustawić nowe warunki skalowania, ustawiając img.norm.vmin/vmax na coś, co lubisz.

+1

Dzięki! To działało dla mnie. =) –

Powiązane problemy