三回目の魅力。私の推測では、これはバグであり、Zhenyaの回答は最新バージョンで修正されていることを示唆しています。私はバージョン0.99.1.1を持っており、次のソリューションを作成しました:
import matplotlib.pyplot as plt
import numpy as np
def forceAspect(ax,aspect=1):
im = ax.get_images()
extent = im[0].get_extent()
ax.set_aspect(abs((extent[1]-extent[0])/(extent[3]-extent[2]))/aspect)
data = np.random.rand(10,20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data)
ax.set_xlabel('xlabel')
ax.set_aspect(2)
fig.savefig('equal.png')
ax.set_aspect('auto')
fig.savefig('auto.png')
forceAspect(ax,aspect=1)
fig.savefig('force.png')
これは「force.png」です。
以下は私の失敗ですが、うまくいけば有益な試みです。
2番目の答え:
以下の私の「元の答え」は、と似たようなものなので、やりすぎaxes.set_aspect()
です。使いたいと思いますaxes.set_aspect('auto')
。なぜそうなるのかわかりませんが、たとえば次のスクリプトのように、正方形のイメージプロットが生成されます。
import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(10,20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data)
ax.set_aspect('equal')
fig.savefig('equal.png')
ax.set_aspect('auto')
fig.savefig('auto.png')
「等しい」アスペクト比の画像プロットと
「自動」アスペクト比の画像プロットを作成します
。
下記の「元の回答」で提供されるコードは、明示的に制御されたアスペクト比の開始点を提供しますが、imshowが呼び出されると無視されるようです。
元の回答:
希望のアスペクト比が得られるようにサブプロットパラメータを調整するルーチンの例を次に示します。
import matplotlib.pyplot as plt
def adjustFigAspect(fig,aspect=1):
'''
Adjust the subplot parameters so that the figure has the correct
aspect ratio.
'''
xsize,ysize = fig.get_size_inches()
minsize = min(xsize,ysize)
xlim = .4*minsize/xsize
ylim = .4*minsize/ysize
if aspect < 1:
xlim *= aspect
else:
ylim /= aspect
fig.subplots_adjust(left=.5-xlim,
right=.5+xlim,
bottom=.5-ylim,
top=.5+ylim)
fig = plt.figure()
adjustFigAspect(fig,aspect=.5)
ax = fig.add_subplot(111)
ax.plot(range(10),range(10))
fig.savefig('axAspect.png')
これにより、次のような図が生成されます。
図内に複数のサブプロットがある場合、yおよびxサブプロットの数を、提供されるルーチンのキーワードパラメーター(デフォルトはそれぞれ1)として含めることができます。次に、それらの数値とhspace
およびwspace
キーワードを使用して、すべてのサブプロットに正しいアスペクト比を持たせることができます。
ax.axis('equal')
たまたまやってみましたか?みんなが言ったように、あなたがしたことはうまくいくはずですがax.axis
、回避策を試す別のルートかもしれません。