web-dev-qa-db-ja.com

matplotlibにカラーバーを追加する際のAttributeError

次のコードは、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.
>>>
38
Boris Gorelik

注:私は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にそれほど詳しくありません。

27
Gary Kerr

(これは私が知っている非常に古い質問です)この問題が発生する理由は、状態マシン(matplotlib.pyplot)の使用とOO軸。

plt.imshow関数は、微妙に1つだけ異なる点でax.imshowメソッドと異なります。メソッドax.imshow

  • axesに追加されたImageを作成して返します

関数plt.imshow

  • 現在のAxesに追加された画像を作成して返し、画像を「現在の」画像/マッピング可能に設定します(これは、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は必要ありません。

73
pelson

チュートリアルでこの問題の別の解決策を見つけました。

以下のコードは、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プロットでは機能しませんでした。

コードに次の行を追加/編集します

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