2013-09-02 27 views
5

Her iki eksende de aynı uzunlukta matplotlib'de bir şekle ihtiyacım var. Bunun için 'eşit' seçeneğini kullanıyorum. Çoğu durumda oldukça iyi çalışır ve beklenen sonuçları elde ederim (bkz. Şekil 1), ancak y ekseninin değerleri x'den çok yüksek olduğunda, bu şekil beklenmedik bir davranış gösterir (bkz. Şekil 2). Matplotlib'in bu davranışını bilen var mı?matplotlib axes.set_aspect ('equal') beklenen şekilde davranmıyor

Danke Jörg

 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 

Şekil 1:

When it works

Şekil 2:

When it doesn't work

+3

bu expected.'set_aspect gibi davranır ('eşit') 'x-ekseni üzerinde bir birim üzerinde bir ünite ile aynı uzunlukta olduğu anlamına gelir Y ekseninde, Şekil 1'de görüldüğü gibi. – hooy

+0

Sayısal bir değeri "set_aspect" öğesine iletebilirsiniz, [belgeler] 'e bakın (http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_aspect). 'X' ve 'y' bölümlerini alarak, eksenleri aynı uzunlukta olacak şekilde ölçeklendirebilmelisiniz. – Bakuriu

+0

İlk örneğinizin (Şekil 1) aslında kare olmadığını unutmayın; 430 piksel genişliğinde 400 piksel yüksekliğinde. Bu, iki eksen için biraz farklı veri aralıkları ile tutarlıdır (x ekseni için 0 ila 3.5, y ekseni için 0 ila 3.25), çünkü set_aspect ('eşit') ', aynı veri ölçeklemesini zorlar (veri) her iki eksen için de piksel başına değerler). –

cevap

11

equal x ve y boyutları aynı L olduğu anlamına gelir veri koordinatlarına gir. elle boy oranını ayarlayabilir ekseni kare elde etmek için: Aslında

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

Bu komutun, ** arsa komutundan sonra ** görünür. – Peaceful