2011-09-23 1 views
60

J'ai commencé avec matplot et réussi quelques parcelles de base, mais maintenant je trouve difficile de découvrir comment faire des choses que je dois maintenant :(Matplotlib - légende mondiale et le titre de côté des intrigues secondaires

Ma question réelle est de savoir comment pour placer un titre global et une légende globale sur une figure avec des sous-placettes

Je fais des sous-placettes 2x3 où j'ai beaucoup de graphes différents dans des couleurs différentes (environ 200) Pour les distinguer (la plupart) j'ai écrit quelque chose comme

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 

(aucune réflexion à ce sujet? :)) Chaque sous-schéma a la même fonction de style.

Maintenant, j'essaye d'obtenir un titre global pour tous les sous-plans et aussi une légende globale qui explique tous les styles. Aussi je dois faire la police minuscule pour s'adapter à tous les 200 styles là-bas (je ne ai pas besoin de styles complètement uniques, mais au moins une tentative)

Quelqu'un peut-il m'aider à résoudre cette tâche?

+1

titre mondial: http://matplotlib.sourceforge.net/examples/pylab_examples/newscalarformatter_demo.html –

Répondre

112

titre mondial: Dans les nouvelles versions de matplotlib on peut utiliser Figure.suptitle().

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

Pour ceux qui importent comme celui-ci : 'import matplotlib.pyplot as plt', la commande pouvait être saisie simplement comme' plt.figure(); plt.suptitle ("Titre centré au-dessus de tous les intrigues secondaires"); plt.splplot (231); plt.plot (données [:, 0], données [:, 1]); 'etc ... –

+0

Merci. Cela devrait être la réponse sélectionnée. – gustafbstrom

7

Pour les légendes, vous pouvez utiliser quelque chose comme ci-dessous. Les légendes sont les lignes de tracé sauvegardées. modFreq sont où le nom des étiquettes réelles correspondant aux lignes de l'intrigue. Ensuite, le troisième paramètre est l'emplacement de la légende. Enfin, vous pouvez passer des arguments comme je l'ai fait ici mais j'ai surtout besoin des trois premiers. En outre, vous êtes censé si vous définissez correctement les étiquettes dans la commande plot. Pour appeler simplement la légende avec le paramètre de localisation et il trouve les étiquettes dans chacune des lignes. J'ai eu plus de chance de faire ma propre légende comme ci-dessous. Semble fonctionner dans tous les cas où l'on n'a jamais semblé aller dans l'autre sens. Si vous ne comprenez pas me le faire savoir:

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) 

Vous pouvez également utiliser la jambe pour changer fontsizes ou presque tous les paramètres de la légende.

titre mondial comme indiqué dans le commentaire ci-dessus peut être fait avec l'ajout de texte par le lien fourni: 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 semble la voie à suivre, mais pour ce que ça vaut, le figure a une propriété transFigure que vous pouvez utiliser:

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

En plus du orbeckst answer on pourrait aussi vouloir changer la intrigues secondaires. Voici un MWE dans le style POO:

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

donne:

enter image description here

Questions connexes