AttributeError при добавлении colorbar в matplotlib
Следующий код не запускается на Python 2.5.4:
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()
Сообщение об ошибке
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'
Как я могу добавить colorbar к этому коду?
Ниже приведена информация для переводчика:
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.
>>>
Ответы
Ответ 1
Примечание. Я использую python 2.6.2. Эта же ошибка возникла с вашим кодом, и следующая модификация решила проблему.
Я прочитал следующий пример цветовой панели: 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()
Не уверен, почему ваш пример не работал. Я не знаком с matplotlib.
Ответ 2
(Это очень старый вопрос, который я знаю) Причина, по которой вы видите эту проблему, состоит в том, что вы смешали использование конечного автомата (matplotlib.pyplot) с подходом OO добавления изображений к осям.
Функция plt.imshow
отличается от метода ax.imshow
только одним тонким способом.
Метод ax.imshow
:
- создает и возвращает изображение, добавленное к осям
Функция plt.imshow
:
- создает и возвращает изображение, которое было добавлено к текущим осям, и устанавливает изображение как "текущее" изображение/отображаемое (которое затем автоматически может быть выбрано функцией
plt.colorbar
).
Если вы хотите использовать plt.colorbar
(который во всех, кроме самых экстремальных случаях, вы делаете) с помощью метода ax.imshow
, вам нужно будет передать возвращаемое изображение (которое является экземпляром ScalarMappable
) до plt.colorbar
в качестве первого аргумента:
plt.imshow(image_file)
plt.colorbar()
эквивалентен (без использования конечного автомата):
img = ax.imshow(image_file)
plt.colorbar(img, ax=ax)
Если ax - текущие оси в pyplot, тогда kwarg ax=ax
не требуется.
Ответ 3
Добавьте в свой код следующие строки:
plot = ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99)
pl.colorbar(plot)