2011-09-23 17 views
60

ho iniziato con matplot e sono riuscito alcune trame di base, ma ora mi è difficile scoprire come fare alcune cose che ho bisogno ora :(matplotlib - globale leggenda e titolo da parte sottotrame

La mia domanda reale è come inserire un titolo globale e una legenda globale su una figura con sottotrame

Sto facendo 2x3 sottotrame dove ho molti grafici diversi in vari colori (circa 200). Per distinguere (la maggior parte) di essi ho scritto qualcosa come

def style(i, total): 
    return dict(color=jet(i/total), 
       linestyle=["-", "--", "-.", ":"][i%4], 
       marker=["+", "*", "1", "2", "3", "4", "s"][i%7]) 

fig=plt.figure() 
p0=fig.add_subplot(321) 
for i, y in enumerate(data): 
    p0.plot(x, trans0(y), "-", label=i, **style(i, total)) 
# and more subplots with other transN functions 

(qualche idea su questo? :)) Ogni subplot ha la stessa funzione di stile.

Ora sto cercando di ottenere un titolo globale per tutte le sottotrame e anche una legenda globale che spiega tutti gli stili. Inoltre ho bisogno di rendere il font minuscolo per adattarlo a tutti i 200 stili (non ho bisogno di stili completamente unici, ma almeno qualche tentativo)

Qualcuno può aiutarmi a risolvere questo compito?

+1

titolo globale: http://matplotlib.sourceforge.net/examples/pylab_examples/newscalarformatter_demo.html –

risposta

112

titolo globale: In ogni nuova versione di matplotlib si può usare Figure.suptitle().

from pylab import * 
fig = gcf() 
fig.suptitle("Title centered above all subplots", fontsize=14) 
+33

Per chi importazione come questo : 'importa matplotlib.pyplot as plt', il comando può essere inserito semplicemente come' plt.figure(); plt.suptitle ('Titolo centrato sopra tutte le sottotrame'); plt.subplot (231); plt.plot (data [:, 0], data [:, 1]); 'etc ... –

+0

Grazie. Questa dovrebbe essere la risposta effettiva selezionata. – gustafbstrom

7

Per le etichette delle legende è possibile utilizzare qualcosa come di seguito. Legendlabels sono le linee di trama salvate. modFreq sono dove il nome delle etichette reali corrispondenti alle linee di trama. Quindi il terzo parametro è la posizione della legenda. Infine, puoi passare argomenti come quelli che ho qui, ma principalmente i primi tre. Inoltre, si suppone che tu abbia impostato correttamente le etichette nel comando plot. Per chiamare semplicemente la legenda con il parametro posizione e trova le etichette in ciascuna delle righe. Ho avuto più fortuna a creare la mia leggenda come di seguito. Sembra funzionare in tutti i casi in cui non è mai sembrato che l'altro modo procedesse correttamente. Se non si capisce fatemelo sapere:

legendLabels = [] 
for i in range(modSize): 
    legendLabels.append(ax.plot(x,hstack((array([0]),actSum[j,semi,i,semi])), color=plotColor[i%8], dashes=dashes[i%4])[0]) #linestyle=dashs[i%4]  
legArgs = dict(title='AM Templates (Hz)',bbox_to_anchor=[.4,1.05],borderpad=0.1,labelspacing=0,handlelength=1.8,handletextpad=0.05,frameon=False,ncol=4, columnspacing=0.02) #ncol,numpoints,columnspacing,title,bbox_transform,prop 
leg = ax.legend(tuple(legendLabels),tuple(modFreq),'upper center',**legArgs) 
leg.get_title().set_fontsize(tick_size) 

È anche possibile utilizzare la gamba di cambiare fontsizes o quasi tutti i parametri della leggenda.

titolo globale come indicato nel commento di cui sopra può essere fatto con l'aggiunta di testo per il link fornito: http://matplotlib.sourceforge.net/examples/pylab_examples/newscalarformatter_demo.html

f.text(0.5,0.975,'The new formatter, default settings',horizontalalignment='center', 
     verticalalignment='top') 
3

suptitle sembra la strada da percorrere, ma per quello che vale, il figure ha una proprietà transFigure che è possibile utilizzare:

fig=figure(1) 
text(0.5, 0.95, 'test', transform=fig.transFigure, horizontalalignment='center') 
20

Oltre alla orbeckst answer si potrebbe anche voler spostare il sottotrame verso il basso. Ecco un MWE in stile OOP:

import matplotlib.pyplot as plt 

fig = plt.figure() 
st = fig.suptitle("suptitle", fontsize="x-large") 

ax1 = fig.add_subplot(311) 
ax1.plot([1,2,3]) 
ax1.set_title("ax1") 

ax2 = fig.add_subplot(312) 
ax2.plot([1,2,3]) 
ax2.set_title("ax2") 

ax3 = fig.add_subplot(313) 
ax3.plot([1,2,3]) 
ax3.set_title("ax3") 

fig.tight_layout() 

# shift subplots down: 
st.set_y(0.95) 
fig.subplots_adjust(top=0.85) 

fig.savefig("test.png") 

dà:

enter image description here

Problemi correlati