2013-09-02 25 views
5

Potrzebuję figury w matplotlib, gdzie obie osie są zawsze tej samej długości. Do tego używam opcji "równy". W większości przypadków działa całkiem dobrze i otrzymuję oczekiwane wyniki (patrz rysunek 1), ale gdy wartości osi y są znacznie wyższe niż x, rysunek pokazuje nieoczekiwane zachowanie (patrz rysunek 2). Czy ktoś wie, to zachowanie matplotlib?matplotlib axes.set_aspect ("równy") nie zachowuje się jak oczekiwano

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 

Figura 1:

When it works

Figura 2:

When it doesn't work

+3

rzeczywistości zachowuje się jak expected.'set_aspect („równy”) 'oznacza, że ​​jednostki na osi x jest tej samej długości co jednej jednostki na oś Y, jak widać na rysunku 1. – hooy

+0

Możesz przekazać wartość liczbową do 'set_aspect', patrz [dokumentacja] (http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_aspect). Biorąc iloraz "x" i "y", powinieneś być w stanie przeskalować osie tak, aby miały tę samą długość. – Bakuriu

+0

Zauważ, że twój pierwszy przykład (rysunek 1) w rzeczywistości nie jest kwadratowy; ma około 430 pikseli szerokości i 400 pikseli wysokości. Jest to zgodne z nieco odmiennymi zakresami danych dla dwóch osi (0 do 3.5 dla osi X, 0 do 3.25 dla osi y), ponieważ 'set_aspect ('equal')' wymusza takie samo skalowanie danych (dane wartości na piksel) dla obu osi. –

Odpowiedz

11

equal oznacza, że ​​X i Y wymiary są takie same, l eng we współrzędnych danych. Aby uzyskać kwadrat osi można ustawić ręcznie proporcje:

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

Należy zauważyć, że to polecenie musi pojawia się ** po ** komendzie fabuły. – Peaceful

Powiązane problemy