web-dev-qa-db-ja.com

Imshow:範囲とアスペクト

私は、3Dデータセットを通してスライスと投影を視覚化するソフトウェアシステムを書いています。 matplotlib、特にimshowを使用して、分析コードから取得した画像バッファーを視覚化します。

プロット軸で画像に注釈を付けたいので、imshowが提供するextentキーワードを使用して、画像バッファのピクセル座標をデータ空間座標系にマッピングします。

残念ながら、matplotlibは単位を知りません。 1000 m X 1 kmの寸法で画像をプロットしたい(人工的な例を挙げて)と言います。その場合、範囲は[0, 1000, 0, 1]のようなものになります。画像配列は正方形ですが、extentキーワードで示されるアスペクト比は1000であるため、結果のプロット軸のアスペクト比も1000になります。

Extentキーワードを使用して取得した自動生成された主目盛とラベルを維持したまま、プロットのアスペクト比を強制することは可能ですか?

76
ngoldbaum

画像のアスペクトを手動で設定することにより(または、図の範囲を埋めるように自動スケーリングさせることにより)行うことができます。

デフォルトでは、imshowはプロットのアスペクトを1に設定します。これは多くの場合、画像データに必要なものです。

あなたの場合、次のようなことができます:

import matplotlib.pyplot as plt
import numpy as np

grid = np.random.random((10,10))

fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, figsize=(6,10))

ax1.imshow(grid, extent=[0,100,0,1])
ax1.set_title('Default')

ax2.imshow(grid, extent=[0,100,0,1], aspect='auto')
ax2.set_title('Auto-scaled Aspect')

ax3.imshow(grid, extent=[0,100,0,1], aspect=100)
ax3.set_title('Manually Set Aspect')

plt.tight_layout()
plt.show()

enter image description here

130
Joe Kington