2013-09-02 17 views
5

matplotlibには両方の軸が常に同じ長さの図が必要です。このため私はオプション 'equal'を使用しています。ほとんどの場合、それはかなりうまく動作し、期待される結果が得られます(図1参照)が、y軸の値がxよりもはるかに高い場合、図は予期しない動作を示します(図2参照)。誰もがmatplotlibのこの動作を知っていますか?matplotlib axes.set_aspect( 'equal')は期待通りに動作しません

たDanke、イェルク

 host = SubplotHost(fig, 111) 
     try: 
      min_x_val = min(x for x in self.x_values if x is not None) 
      max_x_val = max(self.x_values) 
     except ValueError: 
      return 

     max_y_val = list() 
     for n, evaluator in enumerate(self.cleaned_evaluators): 
      max_y_val.append(max(self.y_values[n])) 

     # axis settings 
     host.axis['left'].label.set_fontsize('small') 
     host.axis['left'].major_ticklabels.set_fontsize('small') 
     host.axis['bottom'].label.set_fontsize('small') 
     host.axis['bottom'].major_ticklabels.set_fontsize('small') 
     host.axis['bottom'].major_ticklabels.set_rotation(0) 
     host.set_ylabel(y_label) 
     host.set_xlabel(x_label) 


     host.set_xlim(0, max_x_val) 
     host.set_ylim(0, max_y_val) 

     host.minorticks_on() 
     host.toggle_axisline(False) 
     host.axes.set_aspect('equal') 
     host.grid(True, alpha=0.4) 

     return fig 

図1:

When it works

図2:

When it doesn't work

+3

実際の動作:正方形軸を取得するには、アスペクト比を手動で設定することができ図1のようにy軸に設定します。 – hooy

+0

数値を 'set_aspect'に渡すことができます。[documentation](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_aspect )。 'x'と' y'の商を取ると、同じ長さになるように軸をスケールすることができます。 – Bakuriu

+0

最初の例(図1)は実際には正方形ではありません。幅は約430ピクセル、高さは400ピクセルです。これは、 'set_aspect( 'equal')'が同じデータスケーリングを強制しているので、これは2つの軸のわずかに異なるデータ範囲(x軸の場合0〜3.5、y軸の場合0〜3.25)ピクセルあたりの値)。 –

答えて

11

equalは、xとyの寸法が同じLであることを意味しますデータ座標に入る。 expected.`set_aspect(「等しい」) `x軸上の一の単位は、上の一の単位と同じ長さであることを意味する

ax.set_aspect(1./ax.get_data_ratio()) 
+1

このコマンドは、 plotコマンドの後に**表示されます。 – Peaceful

関連する問題