在matplotlib中添加colorbar时的AttributeError

时间:2010-04-15 09:03:04

标签: python 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.
>>>

4 个答案:

答案 0 :(得分:69)

(这是我知道的一个非常古老的问题)你看到这个问题的原因是因为你把状态机(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

答案 1 :(得分:22)

注意:我使用的是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并不熟悉。

答案 2 :(得分:1)

我在教程中找到了解决此问题的另一种方法。

下面的代码对于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图。

答案 3 :(得分:-1)

在代码中添加/编辑以下行

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