matplotlib imshow()グラフ軸の値を変更します


90

入力データがあるとします。

data = np.random.normal(loc=100,scale=10,size=(500,1,32))
hist = np.ones((32,20)) # initialise hist
for z in range(32):
    hist[z],edges = np.histogram(data[:,0,z],bins=np.arange(80,122,2))

私はそれを使用してプロットすることができますimshow()

plt.imshow(hist,cmap='Reds')

取得:

ここに画像の説明を入力してください

ただし、x軸の値は入力データと一致しません(つまり、100の平均、80から122の範囲)。したがって、x軸を変更しての値を表示したいと思いますedges

私が試してみました:

ax = plt.gca()
ax.set_xlabel([80,122]) # range of values in edges
...
# this shifts the plot so that nothing is visible

そして

ax.set_xticklabels(edges)
...
# this labels the axis but does not centre around the mean:

ここに画像の説明を入力してください

使用している入力データを反映するように軸の値を変更する方法についてのアイデアはありますか?


この回答に記載されているpcolor代わりに使用してください。imshow
ニーマル

回答:


144

xticklabels可能であれば変更を避けようとします。そうしないと、たとえばヒストグラムを追加データでオーバープロットすると、非常に混乱する可能性があります。

グリッドの範囲を定義するのがおそらく最善でありimshowextentキーワードを追加することでそれを行うことができます。このようにして、軸は自動的に調整されます。ラベルを変更したい場合はset_xticks、おそらくいくつかのフォーマッターで使用します。ラベルを直接変更することが最後の手段です。

fig, ax = plt.subplots(figsize=(6,6))

ax.imshow(hist, cmap=plt.cm.Reds, interpolation='none', extent=[80,120,32,0])
ax.set_aspect(2) # you may also use am.imshow(..., aspect="auto") to restore the aspect ratio

ここに画像の説明を入力してください


18
interpolation="none"ここで使用された、実際のデータのはるかに正確な表現であることも注目に値します。
2013

4
最も有用な答え。私はこれを使用して、2つの変数(つまり、地震データ)の関数のカラープロットを作成しました。また、imshow()にオプション「aspect = 'auto'」を追加して、地震表示を「ストレッチおよびスクイーズ」できるようにしました。
カートピーク2014年

11

私は同様の問題を抱えていました、そしてグーグルは私をこの投稿に送っていました。私の解決策は少し異なり、コンパクトではありませんでしたが、これが誰かに役立つことを願っています。

matplotlib.pyplot.imshowを使用して画像を表示することは、通常、2Dデータを表示するための高速な方法です。ただし、これはデフォルトで軸にピクセル数のラベルを付けます。プロットしている2Dデータが、配列xとyで定義された均一なグリッドに対応している場合は、matplotlib.pyplot.xticksとmatplotlib.pyplot.yticksを使用して、これらの配列の値を使用してx軸とy軸にラベルを付けることができます。これらは、実際のグリッドデータに対応するいくつかのラベルを、軸のピクセル数に関連付けます。そして、これを行うことは、例えばpcolorのようなものを使用するよりもはるかに高速です。

これがあなたのデータでこれを試みる試みです:

import matplotlib.pyplot as plt

# ... define 2D array hist as you did

plt.imshow(hist, cmap='Reds')
x = np.arange(80,122,2) # the grid to which your data corresponds
nx = x.shape[0]
no_labels = 7 # how many labels to see on axis x
step_x = int(nx / (no_labels - 1)) # step between consecutive labels
x_positions = np.arange(0,nx,step_x) # pixel count at label position
x_labels = x[::step_x] # labels you want to see
plt.xticks(x_positions, x_labels)
# in principle you can do the same for y, but it is not necessary in your case
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.