2013-09-02 24 views
5

Ho bisogno di una figura in matplotlib in cui entrambi gli assi hanno sempre la stessa lunghezza. Per questo sto usando l'opzione 'uguale'. Nella maggior parte dei casi funziona abbastanza bene e ottengo i risultati attesi (vedi figura 1), ma quando i valori dell'asse y sono molto più alti di x, la figura mostra un comportamento inaspettato (vedere la figura 2). Qualcuno conosce questo comportamento di matplotlib?matplotlib axes.set_aspect ('uguale') non si comporta come previsto

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

realtà si comporta come expected.'set_aspect ('uguale') 'significa che un'unità su l'asse x è stessa lunghezza di un'unità della asse y, come mostrato nella Figura 1. – hooy

+0

È possibile passare un valore numerico a 'set_aspect', vedere la [documentazione] (http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_aspect). Prendendo il quoziente di 'x' e' y' dovresti essere in grado di scalare gli assi in modo che abbiano la stessa lunghezza. – Bakuriu

+0

Nota che il tuo primo esempio (Figura 1) non è effettivamente quadrato; è circa 430 pixel di larghezza per 400 pixel di altezza. Questo è coerente con gli intervalli di dati leggermente diversi per i due assi (da 0 a 3.5 per l'asse x, da 0 a 3.25 per l'asse y), perché 'set_aspect ('equal')' sta forzando lo stesso ridimensionamento dei dati (dati valori per pixel) per entrambi gli assi. –

risposta

11

equal significa che le dimensioni X e Y sono uguali l ength in coordinate di dati. Per ottenere quadrato asse è possibile impostare manualmente le proporzioni:

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

Si noti che questo comando deve appare ** dopo ** il comando di stampa. – Peaceful