2011-09-23 24 views
60

He empezado con matplot y logró algunas tramas básicas, pero ahora me resulta difícil descubrir cómo hacer algunas cosas que necesito ahora :(matplotlib - Global leyenda y el título de lado subtramas

Mi pregunta real es cómo para colocar un título global y una leyenda global en una figura con subtramas

Estoy haciendo subtramas de 2x3 donde tengo una gran cantidad de gráficos diferentes en varios colores (alrededor de 200). Para distinguir (la mayoría) de ellos escribí algo como

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 

(¿tiene alguna idea sobre esto? :)) Cada subtrama tiene la misma función de estilo.

Ahora estoy tratando de obtener un título global para todas las subtramas y también una leyenda global que explica todos los estilos. También necesito hacer que la fuente sea pequeña para que quepa en los 200 estilos (no necesito estilos completamente únicos, pero al menos un poco)

¿Alguien me puede ayudar a resolver esta tarea?

+1

título global: http://matplotlib.sourceforge.net/examples/pylab_examples/newscalarformatter_demo.html –

Respuesta

112

título global: En las versiones más recientes de matplotlib se puede utilizar Figure.suptitle().

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

Para los importadores como esto : 'import matplotlib.pyplot as plt', el comando podría ingresarse simplemente como' plt.figure(); plt.suptitle ('Título centrado sobre todas las subtramas'); plt.subplot (231); plt.plot (data [:, 0], data [:, 1]); 'etc ... –

+0

Gracias. Esta debería ser la respuesta seleccionada real. – gustafbstrom

7

Para etiquetas de leyenda puede usar algo como a continuación. Legendlabels son las líneas de trama guardadas. modFreq es donde el nombre de las etiquetas reales corresponde a las líneas de la trama. Entonces el tercer parámetro es la ubicación de la leyenda. Por último, puede pasar cualquier argumento como lo he hecho aquí, pero principalmente necesita los tres primeros. Además, se supone que debes hacerlo si configuras las etiquetas correctamente en el comando de trazado. Para simplemente llamar a leyenda con el parámetro de ubicación y encuentra las etiquetas en cada una de las líneas. He tenido mejor suerte haciendo mi propia leyenda de la siguiente manera. Parece que funciona en todos los casos en los que parece que nunca ha ido al revés. Si usted no entiende que me haga saber:

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) 

También puede utilizar la pierna para cambiar fontsizes o casi cualquier parámetro de la leyenda.

título global como se indica en el comentario anterior se puede hacer con la adición de texto por el enlace que aparece: 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 parece el camino a seguir, pero para lo que vale, la figure tiene una propiedad transFigure que puede utilizar:

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

Además de la orbeckst answer uno podría también quieren cambiar el subparcelas abajo. He aquí un EPM en el estilo de programación orientada a objetos:

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") 

da:

enter image description here

Cuestiones relacionadas