2013-04-20 8 views
12

Vorrei mettere il testo nell'angolo in basso a destra della figura di uguale aspetto. Ho impostato la posizione relativa alla figura tramite ax.transAxes, ma devo definire manualmente il valore relativo delle coordinate in base alle scale di altezza di ogni figura.Python/Matplotlib - Come inserire il testo nell'angolo di uguale aspetto figura

Quale sarebbe un buon modo per conoscere la scala di altezza degli assi e la posizione corretta del testo all'interno della sceneggiatura?

ax = plt.subplot(2,1,1) 
ax.plot([1,2,3],[1,2,3]) 
ax.set_aspect('equal') 
ax.text(1,-0.15, 'text', transform=ax.transAxes, ha='right', fontsize=16) 
print ax.get_position().height 

ax = plt.subplot(2,1,2) 
ax.plot([10,20,30],[1,2,3]) 
ax.set_aspect('equal') 
ax.text(1,-0.15, 'text', transform=ax.transAxes, ha='right', fontsize=16) 
print ax.get_position().height            

enter image description here

risposta

37

Usa annotate.

In effetti, non uso quasi mai text. Anche quando voglio posizionare le cose in coordinate di dati, di solito voglio compensarlo con una certa distanza fissa in punti, che è molto più semplice con annotate.

Come un rapido esempio:

import matplotlib.pyplot as plt 

fig, axes = plt.subplots(nrows=2, subplot_kw=dict(aspect=1)) 

axes[0].plot(range(1, 4)) 
axes[1].plot(range(10, 40, 10), range(1, 4)) 

for ax in axes: 
    ax.annotate('Test', xy=(1, 0), xycoords='axes fraction', fontsize=16, 
       horizontalalignment='right', verticalalignment='bottom') 
plt.show() 

enter image description here

Se vuoi leggermente compensato da un angolo, è possibile specificare un offset attraverso il xytext kwarg (e textcoords per controllare come i valori di xytext sono interpretati). Sto anche utilizzando i ha e va abbreviazioni per horizontalalignment e verticalalignment qui:

import matplotlib.pyplot as plt 

fig, axes = plt.subplots(nrows=2, subplot_kw=dict(aspect=1)) 

axes[0].plot(range(1, 4)) 
axes[1].plot(range(10, 40, 10), range(1, 4)) 

for ax in axes: 
    ax.annotate('Test', xy=(1, 0), xycoords='axes fraction', fontsize=16, 
       xytext=(-5, 5), textcoords='offset points', 
       ha='right', va='bottom') 
plt.show() 

enter image description here

Se stai cercando di posizionarlo sotto gli assi, è possibile utilizzare l'offset per posizionarlo un set distanze indicate ai punti:

import matplotlib.pyplot as plt 

fig, axes = plt.subplots(nrows=2, subplot_kw=dict(aspect=1)) 

axes[0].plot(range(1, 4)) 
axes[1].plot(range(10, 40, 10), range(1, 4)) 

for ax in axes: 
    ax.annotate('Test', xy=(1, 0), xycoords='axes fraction', fontsize=16, 
       xytext=(0, -15), textcoords='offset points', 
       ha='right', va='top') 
plt.show() 

enter image description here

Dai un'occhiata anche allo Matplotlib annotation guide per maggiori informazioni.

+0

Questa è un'ottima risposta ed esempi. Proverò ad usare annotate invece di testo. Grazie mille. – Tetsuro

+0

Ottima risposta! Grazie! – HyperCube

Problemi correlati