Il titolo della figura Python Matplotlib si sovrappone all'etichetta degli assi quando si utilizza twiny


139

Sto cercando di tracciare due quantità separate sullo stesso grafico usando twiny come segue:

fig = figure()
ax = fig.add_subplot(111)
ax.plot(T, r, 'b-', T, R, 'r-', T, r_geo, 'g-')
ax.set_yscale('log')
ax.annotate('Approx. sea level', xy=(Planet.T_day*1.3,(Planet.R)/1000), xytext=(Planet.T_day*1.3, Planet.R/1000))
ax.annotate('Geostat. orbit', xy=(Planet.T_day*1.3, r_geo[0]), xytext=(Planet.T_day*1.3, r_geo[0]))
ax.set_xlabel('Rotational period (hrs)')
ax.set_ylabel('Orbital radius (km), logarithmic')
ax.set_title('Orbital charts for ' + Planet.N, horizontalalignment='center', verticalalignment='top')


ax2 = ax.twiny()
ax2.plot(v,r,'k-')
ax2.set_xlabel('Linear speed (ms-1)')

show()

e i dati sono presentati bene, ma ho il problema che il titolo della figura si sovrappone alle etichette degli assi sull'asse x secondario in modo che sia appena leggibile (volevo pubblicare un esempio di foto qui, ma non ho un rappresentante abbastanza alto ancora).

Mi piacerebbe sapere se esiste un modo semplice per spostare il titolo direttamente di qualche decina di pixel, in modo che il grafico appaia più bello.


1
Benvenuto in Stack Overflow! Se ti colleghi a un imgur che pubblica la tua foto, un utente con un alto rappresentante incorporerà l'immagine nel tuo post per te.
Agganciato il

@Magic - Riconsidereresti quale risposta accettare per questa domanda? Matplotlib ha aggiunto un meccanismo integrato per gestire questo preciso bisogno (la risposta più votata di seguito)
Amelio Vazquez-Reina

Risposte:


243

Non sono sicuro che si tratti di una nuova funzionalità nelle versioni successive di matplotlib, ma almeno per 1.3.1, questo è semplicemente:

plt.title(figure_title, y=1.08)

Questo funziona anche per plt.suptitle(), ma non (ancora) per plt.xlabel(), ecc.


6
Per le etichette è possibile impostare l'argomento labelpad, vedere qui .
Felix Hoffmann,

1
Per quello che vale, non è una nuova funzionalità. titleha impiegato xe yargomentazioni per molto tempo (per quanto io possa ricordare, in ogni caso).
Joe Kington,

3
plt.set_title ('title string', y = 1.08) funziona per me.
Yu Shen,

3
Sarebbe più utile se qualcuno spiegasse cosa sono le unità 1.08 e quali sono le impostazioni predefinite. La mia comprensione è che il valore predefinito è 1
kon psych il

3
@JohnCummings Sembra che il valore predefinito sia y = 1 e l'unità sia "frazione degli assi", ovvero y = 0,5 significa che il titolo si trova al centro degli assi e y = 0 indica che il titolo è appena sopra la parte inferiore di gli assi.
herrlich10

33

Dimentica di usare plt.titlee posiziona il testo direttamente con plt.text. Di seguito è riportato un esempio esagerato:

import pylab as plt

fig = plt.figure(figsize=(5,10))

figure_title = "Normal title"
ax1  = plt.subplot(1,2,1)

plt.title(figure_title, fontsize = 20)
plt.plot([1,2,3],[1,4,9])

figure_title = "Raised title"
ax2  = plt.subplot(1,2,2)

plt.text(0.5, 1.08, figure_title,
         horizontalalignment='center',
         fontsize=20,
         transform = ax2.transAxes)
plt.plot([1,2,3],[1,4,9])

plt.show()

inserisci qui la descrizione dell'immagine


@ user815423426 sì, tight_layoutnon sembra ancora giocare bene con posizionamenti non standard. Forse potresti fare una segnalazione di bug?
Agganciato il

2
Ho trovato una soluzione quando ho usato tight_layout, almeno quando salvi la trama usando figure.savefig () . Se title = plt.title(...)quindi puoi specificare di inquadrare la trama attorno al titolo usando l'opzione bbox_extra_artists:figure.savefig(filename, bbox_extra_artists=(title), bbox_inches='tight')
junkaholik

10
ax.set_title('My Title\n', fontsize="15", color="red")
plt.imshow(myfile, origin="upper")

Se metti '\n'subito dopo la stringa del titolo, la trama viene disegnata appena sotto il titolo. Anche questa potrebbe essere una soluzione rapida.


8

Avevo un problema con l'etichetta x che si sovrapponeva al titolo di una sottotrama; questo ha funzionato per me:

import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 1)
ax[0].scatter(...)
ax[1].scatter(...)
plt.tight_layout()
.
.
.
plt.show()

prima

inserisci qui la descrizione dell'immagine

dopo

inserisci qui la descrizione dell'immagine

riferimento:


4

Basta usare plt.tight_layout()prima plt.show(). Funziona bene.


4

Puoi usare il pad per questo caso:

ax.set_title("whatever", pad=20)
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.