web-dev-qa-db-fra.com

Matplotlib - légende globale et sous-parcelles réservées aux titres

J'ai commencé avec matplot et géré quelques intrigues de base, mais j'ai du mal à découvrir comment faire certaines choses dont j'ai besoin maintenant :(

Ma vraie question est de savoir comment placer un titre global et une légende globale sur une figure comportant des intrigues secondaires.

Je fais des sous-parcelles 2x3 sur lesquelles j'ai beaucoup de graphes de différentes couleurs (environ 200). Pour 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

(des idées à ce sujet? :)) Chaque sous-parcelle a la même fonction de style.

Maintenant, j'essaie d'obtenir un titre global pour toutes les sous-parcelles, ainsi qu'une légende globale expliquant tous les styles. De plus, j'ai besoin de faire la police minuscule pour s'adapter à tous les 200 styles (je n'ai pas besoin de styles complètement uniques, mais au moins quelques tentatives)

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

103
Gerenuk

Titre global : 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)
167
orbeckst

En plus de orbeckst answer , on peut également vouloir décaler les intrigues secondaires. Voici un MWE dans le 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

49
Adobe

Pour les étiquettes de légende, vous pouvez utiliser quelque chose comme ci-dessous. Les légendes sont les lignes de tracé enregistrées. modFreq sont où le nom des étiquettes réelles correspondant aux lignes de tracé. Ensuite, le troisième paramètre est l'emplacement de la légende. Enfin, vous pouvez transmettre n'importe quel argument, comme je l'ai déjà fait ici, mais j'ai surtout besoin des trois premiers. En outre, vous êtes censé le faire si vous définissez correctement les étiquettes dans la commande de tracé. Il suffit d'appeler la légende avec le paramètre location pour trouver les étiquettes dans chacune des lignes. J'ai eu plus de chance en créant ma propre légende comme ci-dessous. Semble fonctionner dans tous les cas où il semble que rien ne se passe normalement. 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 modifier la taille de la police ou presque tous les paramètres de la légende.

Le titre global indiqué dans le commentaire ci-dessus peut être créé en ajoutant du texte via 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
J Spen

suptitle semble être 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')
3
mathtick