30

全て。画像データが変更されたときに図のカラーバーを更新したい。次のようなものです:

img = misc.lena()
fig = plt.figure()
ax = plt.imshow(im)
plt.colorbar(ax)
newimg = img+10*np.randn(512,512)

def update_colorbar(fig,ax,newimg):
    cbar = fig.axes[1]
    ax.set_data(newimg)
    cbar.update_normal(ax)
    plt.draw()

しかし、 fig.axes() から返された結果には、期待どおりのカラーバー インスタンスがないようです。カラーバーのインスタンスを update 関数の引数として渡すだけでよいのですが、fig パラメーターを 1 つ渡すだけで十分だと思いました。フィギュアからカラーバーを取得する方法について、誰かが少し説明できますか? または、'fig.axes()' が AxesImage または Colobar インスタンスを返さず、Axes または AxesSubplot のみを返すのはなぜですか? Axes/Figure についてもっと理解する必要があると思います。ありがとうございます。

4

2 に答える 2

52

変数に保持されていない場合でも、カラーバーを取得すると便利な場合があります。

この場合、次のようにしてプロットからカラーバーを取得できます。

# Create an example image and colourbar
img = np.arange(20).reshape(5,4)
plt.imshow(img)
plt.colorbar()

# Get the current axis 
ax = plt.gca()        

# Get the images on an axis
im = ax.images        

# Assume colorbar was plotted last one plotted last
cb = im[-1].colorbar   

# Do any actions on the colorbar object (e.g. remove it)
cb.remove()

編集:

または、同等に、1 つのライナー:

plt.gca().images[-1].colorbar.remove()

ax.collections[-1]注意: の代わりに を 使用する場合のコメントも参照してくださいax.images[-1]。私にとっては、常に最初の方法でしか機能しませんでした。何が依存するのか、おそらくデータやプロットのタイプがわかりません。


これで、カラーバー APIcbで説明されているコマンドを使用して保存されているかのように操作できます。たとえば、他のコメントで説明されているように、更新を変更または呼び出すことができます。で削除し、で再作成できます。xlimcb.remove()plt.colorbar()

plt.draw()またはshowプロットを更新するために呼び出す必要があります。

画像はカラーバーに関連付けられたマッピング可能なものであり、 で取得できますcb.mappable

于 2015-12-03T06:23:14.010 に答える
29

まず、軸 (基本的にはプロット)、図、マップ可能なスカラー (この場合は画像)、およびカラーバー インスタンスの間で少し混乱していると思います。

プロットが入っているウィンドウです。最figure上位のコンテナです。

通常、各図には 1 つ以上の がありaxesます。これらはプロット/サブプロットです。

カラーバーも図の中にあります。カラーバーを追加すると、カラーバーが表示される新しい軸が作成されます (特に指定しない限り)。 (カラーバーには独自の x と y の制限が必要なため、通常は画像と同じ軸に表示することはできません。等。)

混乱の一部は、状態マシン インターフェイスと OO インターフェイスを混在させているという事実によるものです。これを行うのは問題ありませんが、OO インターフェースを理解する必要があります。

fig.axes[1]カラーバーのインスタンスではありません。これは、カラーバーがプロットされる軸です (また、fig.axes[1]図の 2 番目の軸です。1 つのサブプロットと 1 つのカラーバーを持つ図のカラーバーがある軸になることもありますが、一般的にはそうではありません)。ケース。)

カラーバーを更新する場合は、返されるカラーバー インスタンスを保持する必要がありcolorbarます。

以下は、通常のアプローチ方法の例です。

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random((10,10)) # Generate some random data to plot

fig, ax = plt.subplots() # Create a figure with a single axes.
im = ax.imshow(data)     # Display the image data
cbar = fig.colorbar(im)  # Add a colorbar to the figure based on the image

を使用update_normalしてカラーバーを更新する場合は、ScalarMappable(によって作成された画像imshow、作成するコレクション、作成scatterするなど) が渡されることを期待します (他の方法もあります。全体ではなく、制限のみを更新したい場合がよくあります。) 上記のコードの場合、 を呼び出します。 ContourSetcontourcbar.update_normal(im)

ただし、新しいAxesImageを作成したのではなく、データを変更しただけです。したがって、おそらくやりたいことは次のとおりです。

cbar.set_clim(newimg.min(), newimg.max())
于 2013-11-06T16:36:13.800 に答える