320 votes

comment créer une seule légende pour plusieurs sous-parcelles avec matplotlib ?

Je trace le même type d'informations, mais pour des pays différents, avec plusieurs sous-parcelles avec matplotlib. C'est-à-dire que j'ai 9 tracés sur une grille 3x3, tous avec les mêmes pour les lignes (bien sûr, des valeurs différentes par ligne).

Cependant, je n'ai pas compris comment mettre une seule légende (puisque les 9 sous-parcelles ont les mêmes lignes) sur la figure une seule fois.

Comment je fais ça?

379voto

Ben Usman Points 737

Il existe également une fonction intéressante get_legend_handles_labels() vous pouvez appeler sur le dernier axe (si vous les parcourez) qui collecterait tout ce dont vous avez besoin à partir d'arguments label=

 handles, labels = ax.get_legend_handles_labels()
fig.legend(handles, labels, loc='upper center')

134voto

Evert Points 4285

figlegend est peut-être ce que vous cherchez : http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figlegend

Exemple ici : http://matplotlib.org/examples/pylab_examples/figlegend_demo.html

Un autre exemple:

 plt.figlegend( lines, labels, loc = 'lower center', ncol=5, labelspacing=0. )

ou alors:

 fig.legend( lines, labels, loc = (0.5, 0), ncol=5 )

17voto

carla gama Points 867

Vous n'avez qu'à demander la légende une fois, en dehors de votre boucle.

Par exemple, dans ce cas, j'ai 4 sous-parcelles, avec les mêmes lignes, et une seule légende.

 from matplotlib.pyplot import *

ficheiros = ['120318.nc', '120319.nc', '120320.nc', '120321.nc']

fig = figure()
fig.suptitle('concentration profile analysis')

for a in range(len(ficheiros)):
    # dados is here defined
    level = dados.variables['level'][:]

    ax = fig.add_subplot(2,2,a+1)
    xticks(range(8), ['0h','3h','6h','9h','12h','15h','18h','21h']) 
    ax.set_xlabel('time (hours)')
    ax.set_ylabel('CONC ($\mu g. m^{-3}$)')

    for index in range(len(level)):
        conc = dados.variables['CONC'][4:12,index] * 1e9
        ax.plot(conc,label=str(level[index])+'m')

    dados.close()

ax.legend(bbox_to_anchor=(1.05, 0), loc='lower left', borderaxespad=0.)
         # it will place the legend on the outer right-hand side of the last axes

show()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X