AttributeError при добавлении цветовой шкалы в matplotlib - PullRequest
36 голосов
/ 15 апреля 2010

Следующий код не запускается на 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'

Как добавить цветную полосу в этот код?

Ниже приводится информация о переводчике:

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.
>>>

Ответы [ 4 ]

71 голосов
/ 19 июля 2012

(Это очень старый вопрос, который я знаю). Причина, по которой вы видите эту проблему, заключается в том, что вы смешали использование конечного автомата (matplotlib.pyplot) с ОО-подходом добавления изображений к осям.

Функция 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 не нужен.

23 голосов
/ 15 апреля 2010

Примечание: я использую 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)
img = ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99)
fig.colorbar(img)

pl.show()

Не уверен, почему твой пример не сработал. Я не очень знаком с matplotlib.

1 голос
/ 01 августа 2018

Я нашел другое решение этой проблемы в руководстве.

Приведенный ниже код будет хорошо работать для метода plt.imshow ():

def colorbar(Mappable, Orientation='vertical', Extend='both'):
    Ax = Mappable.axes
    fig = Ax.figure
    divider = make_axes_locatable(Ax)
    Cax = divider.append_axes("right", size="5%", pad=0.05)
    return fig.colorbar(
        mappable=Mappable, 
        cax=Cax,
        use_gridspec=True, 
        extend=Extend,  # mostra um colorbar full resolution de z
        orientation=Orientation
    )

fig, ax = plt.subplots(ncols=2)

img1 = ax[0].imshow(data)
colorbar(img1)

img2 = ax[1].imshow(-data)
colorbar(img2)

fig.tight_layout(h_pad=1)
plt.show()

Может не работать с другими методами построения графиков. Например, он не работал с графиком Geopandas Geodataframe.

0 голосов
/ 03 февраля 2017

Добавьте / отредактируйте следующие строки в вашем коде

plot = ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99)
pl.colorbar(plot)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...