2010-04-15 13 views
23

Poniższy kod nie działa na Python 2.5.4:AttributeError dodając colorbar w matplotlib

from matplotlib import pylab as pl 
import numpy as np 

data = np.random.rand(6,6) 
fig = pl.figure(1) 
fig.clf() 
ax = fig.add_subplot(1,1,1) 
ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99) 
pl.colorbar() 

pl.show() 

Komunikat o błędzie jest

C:\temp>python z.py 
Traceback (most recent call last): 
    File "z.py", line 10, in <module> 
    pl.colorbar() 
    File "C:\Python25\lib\site-packages\matplotlib\pyplot.py", line 1369, in colorbar 
    ret = gcf().colorbar(mappable, cax = cax, ax=ax, **kw) 
    File "C:\Python25\lib\site-packages\matplotlib\figure.py", line 1046, in colorbar 
    cb = cbar.Colorbar(cax, mappable, **kw) 
    File "C:\Python25\lib\site-packages\matplotlib\colorbar.py", line 622, in __init__ 
    mappable.autoscale_None() # Ensure mappable.norm.vmin, vmax 
AttributeError: 'NoneType' object has no attribute 'autoscale_None' 

Jak mogę dodać colorbar do tego kodu?

Poniżej znajduje się informacja tłumacza:

Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

Odpowiedz

15

Uwaga: Używam Pythona 2.6.2. Ten sam błąd został zgłoszony wraz z kodem, a następująca modyfikacja rozwiązała problem.

czytam następujące colorbar przykład: http://matplotlib.sourceforge.net/examples/pylab_examples/colorbar_tick_labelling_demo.html

from matplotlib import pylab as pl 
import numpy as np 

data = np.random.rand(6,6) 
fig = pl.figure(1) 
fig.clf() 
ax = fig.add_subplot(1,1,1) 
cax = ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99) 
fig.colorbar(cax) 

pl.show() 

Nie wiem, dlaczego Twój przykład nie działa. Nie jestem zaznajomiony z matplotlib.

+7

Trzeba być ostrożnym z nazw zmiennych tutaj. W funkcji colorbar znajduje się słowo kluczowe o nazwie 'cax', które oznacza" osie barwowe "(co nie jest tym, co nazwałaś' cax'), lepszą nazwą wyniku 'imshow' może być' img'. – pelson

47

(Jest to bardzo stare pytanie, które znam) Powodem, dla którego widzisz ten problem, jest mieszanie użycia maszyny stanu (matplotlib.pyplot) z podejściem OO dodawania obrazów do osi. Ta funkcja różni się od metody ax.imshow tylko w nieco inny sposób. Sposób ax.imshow:

  • tworzy i zwraca obraz, który został dodany do osi

Funkcja plt.imshow:

  • tworzy i zwraca obraz, który został dodany do bieżące osie, i ustawia obraz jako "bieżący" obraz/mappable (który może być następnie automatycznie podniesiony przez funkcję plt.colorbar).

Jeśli chcesz, aby móc korzystać z plt.colorbar (który we wszystkich, ale najbardziej skrajnych przypadkach, jak ty) metodą ax.imshow, trzeba będzie zdać zwrócony obraz (który jest instancją ScalarMappable) do plt.colorbar jak pierwszy argument:

plt.imshow(image_file) 
plt.colorbar() 

równoważnej (bez korzystania z maszyny stanu) do:

img = ax.imshow(image_file) 
plt.colorbar(img, ax=ax) 

Jeśli AX jest obecny Osie w pyplot, a następnie kwarg ax=ax nie jest potrzebne.

+1

Czy istnieje sposób uzyskania dostępu do obrazu z samego obiektu osi?Załóżmy, że piszesz funkcję, która jest przekazywana do obiektu osi, który ma już obraz, i chcesz, aby twoja funkcja dodawała pasek kolorów. Chciałbym zrobić coś podobnego do plt.colorbar (ax.image, ax = ax). – Emma

+0

Można użyć atrybutu '' images'' na osiach, aby uzyskać listę obrazów w osiach. Alternatywnie "aktywny" obraz na osiach jest dostępny z '' gci'' (z pamięci). – pelson

-2

dodawać/edytować następujące wiersze do kodu

plot = ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99) 
pl.colorbar(plot) 
+0

nie odpowiada na pytanie – invictus

+0

@invictus Odpowiedź jest podobna do tej, którą podał Gary. Odpowiada satysfakcjonująco, jeśli spróbujesz spróbować i EDYTOWAĆ kod przy użyciu tego, co napisałem. Kod pytającego nie działa, ponieważ pl.colorbar() ma niewłaściwe wystąpienie do wykreślenia. "ax" zdefiniowany w kodzie jest domyślnie instancją okna. Funkcja pl.colorbar() musi być skierowana do instancji wydruku. W moim przypadku "fabuła" jest to, co należy podać do pl.colorbar(), który jest podobny do "cax" podany przez Gary –