Python 在matplotlib中添加颜色栏时出现AttributeError

Python 在matplotlib中添加颜色栏时出现AttributeError,python,matplotlib,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()

以下代码无法在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.6.2。您的代码也出现了同样的错误,下面的修改解决了这个问题

我阅读了以下颜色栏示例:


不知道你的例子为什么不起作用。我对matplotlib不太熟悉。

注意:我使用的是python 2.6.2。您的代码也出现了同样的错误,下面的修改解决了这个问题

我阅读了以下颜色栏示例:

不知道你的例子为什么不起作用。我对matplotlib不太熟悉。

(我知道这是一个非常古老的问题)您之所以看到这个问题,是因为您将状态机(matplotlib.pyplot)的使用与向轴添加图像的OO方法混合在一起

plt.imshow
函数与
ax.imshow
方法只有一个细微的不同。 方法
ax.imshow

  • 创建并返回已添加到轴的图像
功能
plt.imshow

  • 创建并返回已添加到当前轴的图像,并将图像设置为“当前”图像/可映射图像(然后可由
    plt.colorbar
    功能自动拾取)
如果您希望能够使用
ax.imshow
方法使用
plt.colorbar
(除最极端的情况外,其他情况都可以),则需要将返回的图像(这是
ScalarMappable
的实例)作为第一个参数传递给
plt.colorbar

plt.imshow(image_file)
plt.colorbar()
等同于(不使用状态机)以下各项:

如果ax是pyplot中的当前轴,那么kwarg
ax=ax
就不需要了。

(我知道这是一个非常老的问题)您看到这个问题的原因是因为您将状态机(matplotlib.pyplot)的使用与向轴添加图像的OO方法混合在一起

plt.imshow
函数与
ax.imshow
方法只有一个细微的不同。 方法
ax.imshow

  • 创建并返回已添加到轴的图像
功能
plt.imshow

  • 创建并返回已添加到当前轴的图像,并将图像设置为“当前”图像/可映射图像(然后可由
    plt.colorbar
    功能自动拾取)
如果您希望能够使用
ax.imshow
方法使用
plt.colorbar
(除最极端的情况外,其他情况都可以),则需要将返回的图像(这是
ScalarMappable
的实例)作为第一个参数传递给
plt.colorbar

plt.imshow(image_file)
plt.colorbar()
等同于(不使用状态机)以下各项:


如果ax是pyplot中的当前轴,则不需要kwarg
ax=ax

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

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

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

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

我在一个教程中找到了这个问题的另一个解决方案

下面的代码适用于plt.imshow()方法:


它可能无法与其他打印方法配合使用。例如,它不适用于Geopandas Geodataframe plot。

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

下面的代码适用于plt.imshow()方法:


它可能无法与其他打印方法配合使用。例如,它不适用于Geopandas Geodataframe plot。

是否有办法从Axis对象本身访问图像?假设您正在编写一个函数,该函数传递了一个Axis对象,该对象已经打印了一个图像,并且您希望您的函数添加一个颜色条。我想做一些类似plt.colorbar(ax.image,ax=ax)的事情。您可以使用轴上的
images
属性来获取轴内的图像列表。或者,轴上的“活动”图像可用
gci
(从内存中)。通过
fig.colorbar()
,更改
plt.colorbar()
是否也可以工作?是否有方法从轴对象本身访问图像?假设您正在编写一个函数,该函数传递了一个Axis对象,该对象已经打印了一个图像,并且您希望您的函数添加一个颜色条。我想做一些类似plt.colorbar(ax.image,ax=ax)的事情。您可以使用轴上的
images
属性来获取轴内的图像列表。或者,轴上的“活动”图像可用
gci
(从内存中)。通过
fig.colorbar()
更改
plt.colorbar()
,它是否也可以工作?不回答问题question@invictus答案与加里给出的类似。如果您付出一些努力,尝试使用我所写的内容编辑代码,那么它的回答会令人满意。提问者的代码不起作用,因为pl.colorbar()被赋予了错误的绘图实例默认情况下,代码中定义的ax'是一个窗口实例。pl.colorbar()必须定向到绘图实例。在我的例子中,“plot”是需要提供给pl.colorbar()的内容,它类似于Garydoesn提供的“cax”,但没有回答这个问题question@invictus答案与加里给出的类似。如果您付出一些努力,尝试使用我所写的内容编辑代码,那么它的回答会令人满意。提问者的代码不起作用,因为pl.colorbar()被赋予了错误的绘图实例默认情况下,代码中定义的ax'是一个窗口实例。pl.colorbar()必须定向到绘图实例。在我的例子中,“plot”是需要提供给pl.colorbar()的内容,它类似于Garysence提供的“cax”。如果您提到一个外部源(教程),包含一个指向该源的链接将非常有用。
ax。figure
是一个非常值得了解的工具。它允许很多功能,而无需将fig直接传递给功能
plot = ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99)
pl.colorbar(plot)
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()