以下代码无法在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.
>>>
答案 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)