Mettere il testo nell'angolo in alto a sinistra della trama matplotlib


112

Come posso inserire il testo nell'angolo in alto a sinistra (o in alto a destra) di una figura matplotlib, ad esempio dove sarebbe una legenda in alto a sinistra, o sopra il grafico ma nell'angolo in alto a sinistra? Ad esempio, se è un plt.scatter (), allora qualcosa che dovrebbe essere all'interno del quadrato dello scatter, messo nell'angolo in alto a sinistra.

Mi piacerebbe farlo senza conoscere idealmente la scala del grafico a dispersione che viene tracciato, ad esempio, poiché cambierà da set di dati a set di dati. Voglio solo che il testo sia più o meno in alto a sinistra, o più o meno in alto a destra. Con il posizionamento del tipo di legenda non dovrebbe comunque sovrapporsi ad alcun punto del grafico a dispersione.

Grazie!


Se vuoi mettere il tuo testo in una casella, stackoverflow.com/questions/20842613/…
raphael

1
Penso che questo sia un duplicato di questa domanda . La domanda duplicata ha anche risposte molto migliori, sebbene il tipo di risposta fornito qui (utilizzando texte ax.transAxes) non sia tra queste.
ImportanceOfBeingErnest

Risposte:


162

Puoi usare text.

text(x, y, s, fontsize=12)

text le coordinate possono essere fornite rispetto all'asse, quindi la posizione del testo sarà indipendente dalla dimensione del grafico:

La trasformazione predefinita specifica che il testo è nelle coordinate dei dati, in alternativa, è possibile specificare il testo nelle coordinate degli assi (0,0 è in basso a sinistra e 1,1 in alto a destra). L'esempio seguente posiziona il testo al centro degli assi:

text(0.5, 0.5,'matplotlib',
     horizontalalignment='center',
     verticalalignment='center',
     transform = ax.transAxes)

Per evitare che il testo interferisca con qualsiasi punto della tua dispersione è più difficile afaik. Il metodo più semplice è impostare y_axis (ymax in ylim((ymin,ymax))) su un valore leggermente superiore alla coordinata y massima dei tuoi punti. In questo modo avrai sempre questo spazio libero per il testo.

EDIT: qui hai un esempio:

In [17]: from pylab import figure, text, scatter, show
In [18]: f = figure()
In [19]: ax = f.add_subplot(111)
In [20]: scatter([3,5,2,6,8],[5,3,2,1,5])
Out[20]: <matplotlib.collections.CircleCollection object at 0x0000000007439A90>
In [21]: text(0.1, 0.9,'matplotlib', ha='center', va='center', transform=ax.transAxes)
Out[21]: <matplotlib.text.Text object at 0x0000000007415B38>
In [22]:

inserisci qui la descrizione dell'immagine

I parametri ha e va impostano l'allineamento del testo rispetto al punto di inserimento. vale a dire. ha = 'left' è un buon set per evitare che un testo lungo esca dall'asse sinistro quando il frame viene ridotto (reso più stretto) manualmente.


Ottengo il centraggio ma come posso farlo essere in alto a sinistra? Ho provato "

1
devi giocare con i valori x, y come indicato ( 0,0 è in basso a sinistra e 1,1 in alto a destra ). Vedi modifica
joaquin

2
@ user3645626 Le importazioni sono: Il from pylab import figure, text, scatter, show codice nella risposta è stato eseguito in una console ipython in modalità pylab dove le importazioni esplicite non erano necessarie. In un ambiente pulito è necessario importare quanto sopra e show()visualizzare la trama
joaquin

5

Una soluzione potrebbe essere quella di utilizzare la plt.legendfunzione, anche se non si desidera una vera legenda. È possibile specificare la posizione della casella della legenda utilizzando il termine locchiave. Ulteriori informazioni possono essere trovate su questo sito web, ma ho anche incluso un esempio che mostra come posizionare una legenda:

ax.scatter(xa,ya, marker='o', s=20, c="lightgreen", alpha=0.9)
ax.scatter(xb,yb, marker='o', s=20, c="dodgerblue", alpha=0.9)
ax.scatter(xc,yc marker='o', s=20, c="firebrick", alpha=1.0)
ax.scatter(xd,xd,xd, marker='o', s=20, c="goldenrod", alpha=0.9)
line1 = Line2D(range(10), range(10), marker='o', color="goldenrod")
line2 = Line2D(range(10), range(10), marker='o',color="firebrick")
line3 = Line2D(range(10), range(10), marker='o',color="lightgreen")
line4 = Line2D(range(10), range(10), marker='o',color="dodgerblue")
plt.legend((line1,line2,line3, line4),('line1','line2', 'line3', 'line4'),numpoints=1, loc=2) 

Notare che loc=2, poiché , la legenda si trova nell'angolo in alto a sinistra del grafico. E se il testo si sovrappone alla trama, puoi rimpicciolirlo usandolegend.fontsize , il che ridurrà la legenda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.