次のコードは、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.
>>>
注:私は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にそれほど詳しくありません。
(これは私が知っている非常に古い質問です)この問題が発生する理由は、状態マシン(matplotlib.pyplot)の使用とOO軸。
plt.imshow
関数は、微妙に1つだけ異なる点で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
は必要ありません。
チュートリアルでこの問題の別の解決策を見つけました。
以下のコードは、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)