Matplotlib-légende globale et sous-titres mis à part

j'ai commencé avec matplot et j'ai géré quelques parcelles de base, mais maintenant je trouve difficile de découvrir comment faire quelques trucs dont j'ai besoin maintenant: (

ma vraie question Est comment placer un titre global et une légende globale sur une figure avec des sous-lots.

je fais des sous-lots 2x3 où j'ai beaucoup de graphes différents en différentes couleurs (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

(toutes les pensées sur cette? :)) Chaque subplot a la même fonction de style.

maintenant j'essaie d'obtenir un titre global pour tous les sous-lots 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à-dessus (je n'ai pas besoin de styles complètement uniques, mais au moins une tentative)

quelqu'un Peut-il m'aider à résoudre cette tâche?

75
demandé sur Gerenuk 2011-09-23 13:05:13

4 réponses

Global title : 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)
132
répondu orbeckst 2013-04-18 07:45:41

en plus de la orbeckst réponse on pourrait également vouloir déplacer les sous-lots vers le bas. Voici un MWE en style 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")

donne:

enter image description here

34
répondu Adobe 2017-05-23 12:17:42

pour les étiquettes de légende peut utiliser quelque chose comme ci-dessous. Les Legendlabels sont les lignes d'intrigue sauvegardées. modFreq sont où le nom des étiquettes réelles correspondant aux lignes de la parcelle. Puis le troisième paramètre est l'emplacement de la légende. Enfin, vous pouvez passer dans tous les arguments comme je l'ai ici-bas, mais principalement besoin les trois premiers. Aussi, vous êtes censé si vous définissez les étiquettes correctement dans la commande plot. De simplement appeler la légende avec le paramètre emplacement et elle trouve les étiquettes dans chacun des ligne. J'ai eu plus de chance de faire mon propre légende comme ci-dessous. Semble fonctionner dans tous les cas où n'ont jamais semblé aller de l'autre voie passe correctement. Si vous ne comprenez pas, faites-le moi 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 pratiquement n'importe quel paramètre 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')
7
répondu J Spen 2015-04-30 08:39:42

suptitle semble la voie à suivre, mais pour ce que cela vaut, le figure a une transFigure propriété que vous pouvez utiliser:

fig=figure(1)
text(0.5, 0.95, 'test', transform=fig.transFigure, horizontalalignment='center')
3
répondu mathtick 2014-01-14 20:15:53