在matplotlib中添加colorbar时的AttributeError

Bor*_*lik 36 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()
Run Code Online (Sandbox Code Playgroud)

错误消息是

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'
Run Code Online (Sandbox Code Playgroud)

如何在此代码中添加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.
>>>
Run Code Online (Sandbox Code Playgroud)

pel*_*son 72

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

plt.imshow功能与ax.imshow方法的区别仅在于一种略有不同的方式.方法ax.imshow:

  • 创建并返回已添加到轴的图像

功能plt.imshow:

  • 创建并返回已添加到当前轴的图像,并将图像设置为"当前"图像/可映射(然后可以由该plt.colorbar功能自动拾取).

如果您希望能够使用该方法plt.colorbar(在所有情况下除了最极端的情况)ax.imshow,您需要将返回的图像(这是a的实例ScalarMappable)plt.colorbar作为第一个参数传递:

plt.imshow(image_file)
plt.colorbar()
Run Code Online (Sandbox Code Playgroud)

等价(不使用状态机):

img = ax.imshow(image_file)
plt.colorbar(img, ax=ax)
Run Code Online (Sandbox Code Playgroud)

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

  • 有没有办法从轴对象本身访问图像?假设您正在编写一个传递经过轴对象的函数,该对象上已经绘制了图像,并且希望您的函数添加一个颜色条。我想做类似plt.colorbar(ax.image,ax = ax)的事情。 (2认同)

Gar*_*err 26

注意:我使用的是python 2.6.2.您的代码引发了同样的错误,以下修改解决了问题.

我阅读了以下colorbar示例: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()
Run Code Online (Sandbox Code Playgroud)

不确定为什么你的例子不起作用.我对matplotlib并不熟悉.