2013-09-02 7 views
5

Ich brauche eine Figur in Matplotlib, wo beide Achsen immer die gleiche Länge haben. Dazu benutze ich die Option 'gleich'. In den meisten Fällen funktioniert es ziemlich gut und ich bekomme die erwarteten Ergebnisse (siehe Abbildung 1), aber wenn die Werte der y-Achse viel höher als x sind, zeigt die Abbildung ein unerwartetes Verhalten (siehe Abbildung 2). Kennt jemand dieses Verhalten von Matplotlib?matplotlib axes.set_aspect ('equal') verhält sich nicht wie erwartet

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 

Abbildung 1:

When it works

Abbildung 2:

When it doesn't work

+3

Tatsächlich verhält es als expected.'set_aspect (‚gleich‘) 'bedeutet, dass eine Einheit auf der x-Achse ist von gleicher Länge wie eine Einheit auf dem y-Achse, wie in Abbildung 1 zu sehen. – hooy

+0

Sie können einen numerischen Wert an 'set_aspect' übergeben, siehe [Dokumentation] (http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_aspect). Nimmt man den Quotienten von "x" und "y", sollte man in der Lage sein, die Achsen so zu skalieren, dass sie die gleiche Länge haben. – Bakuriu

+0

Beachten Sie, dass Ihr erstes Beispiel (Abbildung 1) nicht wirklich quadratisch ist; es ist etwa 430 Pixel breit und 400 Pixel hoch. Dies steht im Einklang mit den leicht unterschiedlichen Datenbereichen für die beiden Achsen (0 bis 3,5 für die X-Achse, 0 bis 3,25 für die Y-Achse), da 'set_aspect ('equal')' die gleiche Datenskalierung (Daten Werte pro Pixel) für beide Achsen. –

Antwort

11

equal bedeutet, daß die X- und Y-Abmessungen sind gleich l in Datenkoordinaten. Zum Quadrat erhält Achse manuell das Seitenverhältnis einstellen:

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

Beachten Sie, dass dieser Befehl muss erscheint ** nach dem Befehl plot. – Peaceful

Verwandte Themen