2011-11-01 22 views
74

私は(imshowを使用して)正方形のプロットを作成しようとしています。つまり、縦横比は1:1ですが、できません。これらの仕事のどれも:matplotlibでアスペクト比を設定するにはどうしたらいいですか?

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の問題があるようです)。

+5

偶然、 'ax.axis( 'equal')'を試しましたか?誰もが言ったように、あなたがしたことはうまくいくはずですが、 'ax.axis'は回避策を試みる別のルートかもしれません。 –

+0

http://matplotlib.org/examples/pylab_examples/equal_aspect_ratio.html –

答えて

53

3回目の魅力。私の推測では、これはバグであり、Zhenya's answerはそれが最新バージョンで修正されていることを示唆しています。私は、バージョン0.99.1.1を持っていると私は、次の解決策を作成しました:enter image description here

以下は私の失敗し、まだうまくいけば、有益な試みをしている:これは「force.png」の

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') 

です。

セカンド回答:それはaxes.set_aspect()に似た何かをするよう

私のオリジナルの答えは "以下、過剰です。私はあなたがaxes.set_aspect('auto')を使用したいと思う。このような場合は、なぜ私は理解していないが、それは私のための正方形の画像のプロットを作成し、例えば、このスクリプト: enter image description here と1と:

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') 

は「等しい」アスペクト比の画像プロットを作成します'auto'縦横比: enter image description here

「元の回答」の下に示されているコードは、明示的に制御された縦横比の開始点を示していますが、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') 

これがそうのような図を生成します。 enter image description here

数字の中に複数のサブプロットがある場合は、 ouldは、提供されたルーチンに、yとxのサブプロットの数をキーワードパラメータ(それぞれ1にデフォルト設定)として含める必要があります。これらの数値とhspacewspaceのキーワードを使用すると、すべてのサブプロットを正しいアスペクト比にすることができます。

+0

ありがとうございました。大いにありがとうございました。感謝してくれてありがとうございます:-) – jtlz2

+0

'get_images'が空リストになっている場合(' axl.plot([0,1]、[0,2]) 'のように)' get_xlim'と ' get_ylim' – Joel

+0

logscaleを使っていればこれがうまくいかないようですが、それをテストし、それを処理する答えを追加しました。あなたの答えにそれを組み入れてから、私を削除してください。 – Joel

2

あなたはfigaspectで試してください。わたしにはできる。ドキュメントから:

指定されたアスペクト比でFigureを作成します。 argが数字の場合は、その縦横比を使用してください。 >argが配列の場合、figaspectは のアスペクト比を保持するFigureの幅と高さを決定します。 Figureの幅、高さ(インチ)は です。 、と同等の高さで例えば

使用例を軸を必ず作成してください:

# make a figure twice as tall as it is wide 
    w, h = figaspect(2.) 
    fig = Figure(figsize=(w,h)) 
    ax = fig.add_axes([0.1, 0.1, 0.8, 0.8]) 
    ax.imshow(A, **kwargs) 

    # make a figure with the proper aspect for an array 
    A = rand(5,3) 
    w, h = figaspect(A) 
    fig = Figure(figsize=(w,h)) 
    ax = fig.add_axes([0.1, 0.1, 0.8, 0.8]) 
    ax.imshow(A, **kwargs) 

編集:私はあなたが探しているもののことを確認していません。上記のコードは、キャンバス(プロットサイズ)を変更します。あなたは図の、matplotlibのウィンドウのサイズを変更したい場合は、使用します。

In [68]: f = figure(figsize=(5,1)) 

これは5X1(幅x高)のウィンドウを生成しません。

+0

ありがとうございます - これはキャンバスの縦横比を変更する際にいくつかの効果があります:具体的には、縦横比を変更する必要があります。 figure = plt.figure(figsize =(plt.figaspect(2.0))) – jtlz2

17

実行中のmatplotlibのバージョンは何ですか?私は最近1.1.0にアップグレードしなければなりませんでした。それで、add_subplot(111,aspect='equal')が私に役立ちます。

+0

It's 1.0.1。おそらく答えです。 – jtlz2

+0

'matplotlib'バージョン' 2.0.2'、 'jupyter notebook'バージョン' 5.0.0'でうまく動作します。ありがとう。 – Sathish

1

この回答はYannの答えに基づいています。線形プロットまたはログログプロットのアスペクト比を設定します。私はhttps://stackoverflow.com/a/16290035/2966723の追加情報を使用して、軸がログスケールであるかどうかをテストしました。

def forceAspect(ax,aspect=1): 
    #aspect is width/height 
    scale_str = ax.get_yaxis().get_scale() 
    xmin,xmax = ax.get_xlim() 
    ymin,ymax = ax.get_ylim() 
    if scale_str=='linear': 
     asp = abs((xmax-xmin)/(ymax-ymin))/aspect 
    elif scale_str=='log': 
     asp = abs((scipy.log(xmax)-scipy.log(xmin))/(scipy.log(ymax)-scipy.log(ymin)))/aspect 
    ax.set_aspect(asp) 

明らかにあなたが欲しいlogのいずれかのバージョンを使用することができ、私はscipyを使用しましたが、numpyまたはmathは問題ないはずです。

関連する問題