Imshow:範囲と側面



Imshow Extent Aspect



解決:

これを行うには、画像のアスペクトを手動で設定します(または、自動拡大縮小して図の範囲を埋めます)。

デフォルトでは、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( '自動スケーリングされたアスペクト')ax3.imshow(grid、extent = [0,100,0,1]、アスペクト= 100)ax3.set_title( '手動でアスペクトを設定')plt.tight_layout()plt.show()

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




からplt.imshow()公式ガイドでは、アスペクトが軸のアスペクト比を制御することがわかっています。私の言葉では、アスペクトは正確にxの比率です 単位 およびy 単位 。意図せずに数字を歪めたくないので、ほとんどの場合、1のままにしておきます。ただし、実際には、アスペクトに1以外の値を指定する必要がある場合があります。質問者は、x軸とy軸の物理単位が異なる可能性があるという良い例を示しました。 xがkmで、yがmであると仮定しましょう。したがって、10x10データの場合、範囲は[0,10km、0,10m] = [0、10000m、0、10m]である必要があります。このような場合、デフォルトのアスペクト= 1を引き続き使用すると、図の品質が非常に悪くなります。したがって、アスペクト= 1000を指定して、図を最適化できます。次のコードは、この方法を示しています。

%matplotlib inline import numpy as np import matplotlib.pyplot as plt rng = np.random.RandomState(0)data = rng.randn(10,10)plt.imshow(data、origin = 'lower'、extent = [0、 10000、0、10]、アスペクト= 1000)

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

それでも、質問者の要求を満たすことができる代替案があると思います。範囲を[0,10,0,10]として設定し、単位を示すためにxy軸ラベルを追加するだけです。次のようにコーディングします。



plt.imshow(data、origin = 'lower'、extent = [0、10、0、10])plt.xlabel( 'km')plt.ylabel( 'm')

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

作ります 正しい 図、私たちは常にそれを心に留めておく必要がありますx_max-x_min = x_res * data.shape [1]およびy_max-y_min = y_res * data.shape [0]、ここでエクステント= [x_min、x_max、y_min、y_max]。デフォルトでは、アスペクト= 1は、単位ピクセルが正方形であることを意味します。このデフォルトの動作は、値が異なるx_resとy_resでも正常に機能します。前の例を拡張して、x_resが1.5で、y_resが1であると仮定します。したがって、エクステントは[0,15,0,10]に等しくなければなりません。デフォルトのアスペクトを使用すると、長方形のカラーピクセルを使用できますが、単位ピクセルは正方形のままです。

plt.imshow(data、origin = 'lower'、extent = [0、15、0、10])#または、x_maxとy_maxは似ていますが、data.shapeが異なるため、ピクセル解像度が異なります。 data = rng.randn(10,5)plt.imshow(data、origin = 'lower'、extent = [0、5、0、5])

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

カラーピクセルの側面はx_res / y_res。そのアスペクトを単位ピクセルのアスペクトに設定します(つまり、アスペクト= x_res / y_res =((x_max-x_min)/ data.shape [1])/((y_max-y_min)/ data.shape [0]))は、常に正方形のカラーピクセルを提供します。 x軸の単位がy軸の単位の1.5倍になるように、アスペクト= 1.5を変更できます。これにより、正方形のカラーピクセルと正方形の全体像が得られますが、長方形のピクセル単位になります。どうやら、それは通常受け入れられていません。

data = rng.randn(10,10)plt.imshow(data、origin = 'lower'、extent = [0、15、0、10]、aspect = 1.5)

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

最も望ましくないケースは、アスペクトを1.2などの任意の値に設定することです。これにより、正方形の単位ピクセルも正方形のカラーピクセルも生成されません。

plt.imshow(data、origin = 'lower'、extent = [0、15、0、10]、aspect = 1.2)

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

簡単に言えば、正しい範囲を設定し、matplotlibに残りの処理を実行させるだけで常に十分です(x_res!= y_resであっても)!必要な場合にのみアスペクトを変更してください。