Je trace le même type d'informations, mais pour différents pays, avec plusieurs sous-graphiques avec matplotlib. Autrement dit, j'ai 9 tracés sur une grille 3x3, tous avec la même chose 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-graphiques ont les mêmes lignes) sur la figure une seule fois.
Comment je fais ça?
python
matplotlib
poche de fromage
la source
la source
handles, labels = [(a + b) for a, b in zip(ax1.get_legend_handles_labels(), ax2.get_legend_handles_labels())]
figlegend est peut-être ce que vous recherchez: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figlegend
Exemple ici: http://matplotlib.org/examples/pylab_examples/figlegend_demo.html
Un autre exemple:
ou:
la source
lines
variable pour laquelle placer l'argumentlegend
?lines
est une liste de résultats renvoyés paraxes.plot()
(c'est-à-dire que chaqueaxes.plot
routine ou similaire renvoie une "ligne"). Voir également l'exemple lié.Pour le positionnement automatique d'une seule légende dans un
figure
à plusieurs axes, comme ceux obtenus avecsubplots()
, la solution suivante fonctionne très bien:Avec
bbox_to_anchor
et,bbox_transform=plt.gcf().transFigure
vous définissez une nouvelle boîte englobante de la taille de votrefigure
comme référenceloc
. L'utilisation(0,-0.1,1,1)
déplace cette boîte de boudinage légèrement vers le bas pour éviter que la légende ne soit placée sur d'autres artistes.OBS: utilisez cette solution APRÈS avoir utilisé
fig.set_size_inches()
et AVANT d'utiliserfig.tight_layout()
la source
loc='upper center', bbox_to_anchor=(0.5, 0), bbox_transform=plt.gcf().transFigure
et il ne se chevauchera pas à coup sûr.Vous n'avez qu'à demander la légende une fois, en dehors de votre boucle.
Par exemple, dans ce cas, j'ai 4 sous-graphiques, avec les mêmes lignes et une seule légende.
la source
figlegend
, comme suggéré par Evert, semble être une bien meilleure solution;)fig.legend()
est qu'il nécessite une identification pour toutes les lignes (parcelles) ... car, pour chaque sous-graphique, j'utilise une boucle pour générer les lignes, la seule solution que j'ai trouvée pour surmonter cela est de créer une liste vide avant la deuxième boucle, puis ajoutez les lignes au fur et à mesure de leur création ... Ensuite, j'utilise cette liste comme argument de lafig.legend()
fonction.dados
il?dados
était un ensemble de données d'un fichier netCDF4 (pour chacun des fichiers définis dans la listeficheiros
). Dans chaque boucle, un fichier différent est lu et un sous-tracé est ajouté à la figure.J'ai remarqué qu'aucune réponse n'affiche une image avec une seule légende référençant de nombreuses courbes dans différentes sous-parcelles, donc je dois vous en montrer une ... pour vous rendre curieux ...
Maintenant, vous voulez regarder le code, n'est-ce pas?
Les deux lignes
mérite une explication - dans ce but, j'ai encapsulé la partie délicate dans une fonction, juste 4 lignes de code mais fortement commenté
PS Je reconnais que
sum(list_of_lists, [])
c'est une méthode vraiment inefficace pour aplatir une liste de listes mais ① j'aime sa compacité, ② est généralement quelques courbes dans quelques sous-graphiques et ③ Matplotlib et l'efficacité? ;-)la source
Bien qu'assez tardif dans le jeu, je vais donner une autre solution ici car c'est toujours l'un des premiers liens à apparaître sur Google. En utilisant matplotlib 2.2.2, cela peut être réalisé en utilisant la fonction gridspec. Dans l'exemple ci-dessous, le but est d'avoir quatre sous-graphiques disposés en 2x2 avec la légende affichée en bas. Un axe «faux» est créé en bas pour placer la légende à un endroit fixe. L'axe «faux» est alors désactivé pour que seule la légende s'affiche. Résultat: https://i.stack.imgur.com/5LUWM.png .
la source
si vous utilisez des sous-graphiques avec des graphiques à barres, avec une couleur différente pour chaque barre. il peut être plus rapide de créer vous-même les artefacts en utilisant
mpatches
Supposons que vous ayez quatre barres de couleurs différentes, car
r
m
c
k
vous pouvez définir la légende comme suitla source
plt.legend
pour avoir une légende pour tous mes soushandles, _ = plt.gca().get_legend_handles_labels()
fig.legend(handles, labels)
Cette réponse est un complément à @ Evert sur la position de la légende.
Mon premier essai sur la solution de @ Evert a échoué en raison de chevauchements de la légende et du titre de l'intrigue secondaire.
En fait, les chevauchements sont causés par
fig.tight_layout()
, qui modifie la disposition des sous-graphiques sans tenir compte de la légende de la figure. Cependant,fig.tight_layout()
c'est nécessaire.Afin d'éviter les chevauchements, nous pouvons dire
fig.tight_layout()
de laisser des espaces pour la légende de la figure parfig.tight_layout(rect=(0,0,1,0.9))
.Description des paramètres tight_layout () .
la source
Pour s'appuyer sur la réponse de @ gboffi et de Ben Usman:
Dans une situation où l'on a des lignes différentes dans différentes sous-parcelles avec la même couleur et la même étiquette, on peut faire quelque chose du genre
la source