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?
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)
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:
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')
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')