Matplotlibを使用して、いくつかのデータをpythonでプロットし、プロットには標準のカラーバーが必要です。データは、周波数情報を含む一連のNxM行列で構成され、単純なimshow()プロットは2D頻度を表す色付きのヒストグラム。各マトリックスには、異なるが重複する範囲のデータが含まれますImshowは、各マトリックスのデータを範囲0-1に正規化します。つまり、たとえば、マトリックスAのプロットは、マトリックス2 * A(ただし、カラーバーには2倍の値が表示されます)。たとえば、すべてのプロットで同じ周波数に対応するように、赤色を使用します。つまり、単一のカラーバーすべてのプロットで十分です。どんな提案でも大歓迎です。
@ianilisの答えを盗むのではなく、例を追加したかった...
複数の方法がありますが、最も簡単なのは、vmin
およびvmax
kwargsをimshow
に指定することです。または、matplotlib.cm.Colormap
インスタンスを指定して指定しますが、単純な場合には必要以上に複雑です。
すべての画像に単一のカラーバーを使用した簡単な例を次に示します。
import numpy as np
import matplotlib.pyplot as plt
# Generate some data that where each slice has a different range
# (The overall range is from 0 to 2)
data = np.random.random((4,10,10))
data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None]
# Plot each slice as an independent subplot
fig, axes = plt.subplots(nrows=2, ncols=2)
for dat, ax in Zip(data, axes.flat):
# The vmin and vmax arguments specify the color limits
im = ax.imshow(dat, vmin=0, vmax=2)
# Make an axis for the colorbar on the right side
cax = fig.add_axes([0.9, 0.1, 0.03, 0.8])
fig.colorbar(im, cax=cax)
plt.show()
最も簡単な解決策は、各プロットに同じ引数を指定してclim(lower_limit、upper_limit)を呼び出すことです。
これは質問の半分だけに答えるか、新しい質問を開始します。変更する場合
data *= np.array([0.5, 1.0, 1.5, 2.0])[:,None,None]
に
data *= np.array([2.0, 1.0, 1.5, 0.5])[:,None,None]
カラーバーは0から0.5になりますが、この場合は濃い青からわずかに明るい青で、範囲全体(0から2)をカバーしません。カラーバーは、vmin
およびvmax
に関係なく、最後の画像または輪郭の色のみを表示します。
vmin
とvmax
を手動で設定することを提案したソリューションに満足できなかったため、各プロットの制限を読み取り、vmin
とvmax
。
以下の例は、平均値が増加する正規分布から取得したサンプルの3つのプロットを示しています。
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid
import numpy as np
numberOfPlots = 3
data = []
for i in range(numberOfPlots):
mean = i
data.append(np.random.normal(mean, size=(100,100)))
fig = plt.figure()
grid = ImageGrid(fig, 111, nrows_ncols=(1,numberOfPlots), cbar_mode='single')
ims = []
for i in range(numberOfPlots):
ims.append(grid[i].imshow(data[i]))
grid[i].set_title("Mean = " + str(i))
clims = [im.get_clim() for im in ims]
vmin = min([clim[0] for clim in clims])
vmax = max([clim[1] for clim in clims])
for im in ims:
im.set_clim(vmin=np.floor(vmin),vmax=np.ceil(vmax))
grid[0].cax.colorbar(ims[0]) # with cbar_mode="single", cax attribute of all axes are identical
fig.show()