2017-01-11 20 views
2

の現在のアスペクト比を、そのアスペクトが'auto'に設定されている場合、そのアスペクト比を簡単かつ確実に確認する方法はありますか?軸のアスペクト比を取得する

確認するのはax.get_aspect()ですが、それはちょうど'auto'を返します。 ax.set_aspect(aspect)によって任意の定数値に設定できます。その後、同じ定数がax.get_aspect()によって返されます。デフォルトでは非常に便利ですが、aspect = 'auto'があります。この場合、アスペクト比は自動的に計算され、データの制限と軸のサイズに合わせて調整されます。
自動的に選択された数値アスペクト比はどのようにして取得できますか?明確にするため

、これはax.get_data_ratio()によって返さデータ範囲、また(図の場合)fig.get_figheight()/fig.get_figwidth()によって返される図形またはサブプロットの表示サイズのアスペクト比のアスペクト比でもありません。それはディスプレイのサイズとデータの限界の両方に依存するので、少し微妙です。 (どの異なる比率と私はそれが重要なことは容易にアクセス持って見つける理由を混乱につながる可能性があります。)

+0

あなたはどのようなアスペクト比を参照して?データまたは表示? –

+0

@フランクの答えに対するあなたのコメントに基づいて、私はディスプレイやもっと複雑なものを推測するつもりです。 –

+0

残念ながら、@MadPhysicistは「もっと複雑なものです」。私の編集した質問を参照してください。 – askewchan

答えて

0

私が見つけることができる最善のことはこれです:

def get_aspect(ax=None): 
    if ax is None: 
     ax = plt.gca() 
    fig = ax.figure 

    ll, ur = ax.get_position() * fig.get_size_inches() 
    width, height = ur - ll 
    axes_ratio = height/width 
    aspect = axes_ratio/ax.get_data_ratio() 

    return aspect 

しかし、それは驚くほど複雑だ、と私私がbboxtransformオブジェクトについて何も知らないので、それが変換などの下で信頼できるかどうかわかりません。

+1

これをあなたの質問に追加して、これより簡単で信頼できる方法があるかどうか尋ねてください。 – depperm

+0

このコードは、matplotlib自体の 'Axes.apply_aspect'のコードに似ています。 –

0

どの約

import numpy as np 
aspect = sum(np.abs(ax.get_xlim()))/sum(np.abs(ax.get_ylim())) 
+0

ありがとう、@フランク、しかし、私はちょうど '1/ax.get_data_ratio()'を与えると信じています。 – askewchan

+0

ああ、それは私の提案よりもよく、さらに良いです。私はこれが存在するのか分からなかった。私はそれがあなたが探しているものだと思ったが、明らかにその何か他のものだと思った。ごめんなさい。 –

2

docsから、アスペクト比は、X軸とY軸のデータ・ツー・ディスプレイスケーリング単位の比です。すなわち、y方向に1表示当たり10データ単位、x方向に表示単位当たり1データ単位がある場合、その比は1/10となる。円は背の高いものよりも10倍広くなります。これは、numのアスペクトが以下を実行するという文に対応します。

サークルは、高さが幅のnum倍になるように伸びます。 aspect = 1はaspect = 'equal'と同じです。

あなたは(matplotlib.axes._base.adjust_aspect, starting around line 1405)を見て、コードの同じオリジナル作品をもとに、私たちは限り、あなたは唯一の線形デカルト軸のこの比率を必要として、簡略化した式を考え出すことができると思います。極軸と対数軸では複雑になるので無視します。

式の繰り返しに:

(x_data_unit/x_display_unit)/(y_data_unit/y_display_unit) 

これは、この最後の製剤は、の比によって分割された2つの方向の表示サイズのちょうど比で

(y_display_unit/x_display_unit)/(y_data_unit/x_data_unit) 

と同じであることを起こりますxとyの制限。それは、実際のデータの境界ではなく、すべての軸の制限のために結果を返すためax.get_data_ratioがここでは適用されないことに注意してください:

from operator import sub 
def get_aspect(ax): 
    # Total figure size 
    figW, figH = ax.get_figure().get_size_inches() 
    # Axis size on figure 
    _, _, w, h = ax.get_position().bounds 
    # Ratio of display units 
    disp_ratio = (figH * h)/(figW * w) 
    # Ratio of data units 
    # Negative over negative because of the order of subtraction 
    data_ratio = sub(*ax.get_ylim())/sub(*ax.get_xlim()) 

    return disp_ratio/data_ratio 

今度はそれをテストしてみましょう:

from matplotlib import pyplot as plt 
fig, ax = plt.subplots() 
ax.set_aspect('equal') 
print('{} == {}'.format(ax.get_aspect(), get_aspect(ax))) 
ax.set_aspect(10) 
print('{} == {}'.format(ax.get_aspect(), get_aspect(ax))) 
関連する問題