1. ホーム
  2. python

[解決済み] matplotlibでアスペクト比を設定するには?

2022-03-05 15:53:34

質問

正方形のプロット(imshowを使用)、つまりアスペクト比1:1のプロットを作ろうとしているのですが、うまくいきません。どれもうまくいきません。

import matplotlib.pyplot as plt

ax = fig.add_subplot(111,aspect='equal')
ax = fig.add_subplot(111,aspect=1.0)
ax.set_aspect('equal')
plt.axes().set_aspect('equal')

呼び出しが無視されているだけのような気がします(matplotlibでよくある問題のようです)。

どうすればいいですか?

3度目の正直です。私の推測では、これはバグであり ゼンヤの回答 は、最新版で修正されていることを示唆しています。私はバージョン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)としてルーチンに含めたいと思うことは想像がつきます。そして、これらの数値と hspacewspace キーワードを使用すると、すべてのサブプロットを正しいアスペクト比にすることができます。