1. ホーム
  2. python

[解決済み] イムショー:エクステントとアスペクト

2022-12-10 09:26:57

質問

3Dデータセットのスライスとプロジェクションを視覚化するソフトウェアシステムを書いています。 私は matplotlib を使っていますが、特に imshow で、解析コードから戻ってきた画像バッファを可視化します。

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

不本意ながら matplotlib は単位について知らないのです。 例えば、(人工的な例ですが)寸法が 1000 m X 1 km . この場合、エクステントは次のようになります。 [0, 1000, 0, 1] . 画像配列が正方形であっても、extentキーワードが意味する縦横比は1000であるため、結果として得られるプロット軸も縦横比1000となります。

extentキーワードを使用することによって得られる自動的に生成された主要な目盛りとラベルをまだ維持しながら、プロットのアスペクト比を強制することは可能でしょうか?

どのように解決するのですか?

画像のアスペクトを手動で設定する(または図の範囲を埋めるようにオートスケールさせる)ことで可能です。

デフォルトでは 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()

<イグ