web-dev-qa-db-ja.com

pythonの一連のプロットの標準カラーバーを作成するにはどうすればよいですか

Matplotlibを使用して、いくつかのデータをpythonでプロットし、プロットには標準のカラーバーが必要です。データは、周波数情報を含む一連のNxM行列で構成され、単純なimshow()プロットは2D頻度を表す色付きのヒストグラム。各マトリックスには、異なるが重複する範囲のデータが含まれますImshowは、各マトリックスのデータを範囲0-1に正規化します。つまり、たとえば、マトリックスAのプロットは、マトリックス2 * A(ただし、カラーバーには2倍の値が表示されます)。たとえば、すべてのプロットで同じ周波数に対応するように、赤色を使用します。つまり、単一のカラーバーすべてのプロットで十分です。どんな提案でも大歓迎です。

37
user1010845

@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()

enter image description here

73
Joe Kington

最も簡単な解決策は、各プロットに同じ引数を指定してclim(lower_limit、upper_limit)を呼び出すことです。

9
Christian Alis

これは質問の半分だけに答えるか、新しい質問を開始します。変更する場合

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に関係なく、最後の画像または輪郭の色のみを表示します。

2
robert

vminvmaxを手動で設定することを提案したソリューションに満足できなかったため、各プロットの制限を読み取り、vminvmax

以下の例は、平均値が増加する正規分布から取得したサンプルの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()

enter image description here

0
toliveira