Comment mettre de la légende de l'intrigue
J'ai une série de 20 parcelles (parcelles) pour être réalisés en une seule figure. Je veux la légende à l'extérieur de la boîte. En même temps, je ne veux pas changer les axes, comme la taille de la figure est réduite. De bien vouloir m'aider pour les requêtes suivantes:
- Je veux garder la boîte de la légende à l'extérieur de la zone de traçage. (Je veux la légende pour être à l'extérieur sur le côté droit de la zone de traçage).
- Est-il de toute façon que je réduire la taille de police du texte à l'intérieur de la boîte de la légende, de sorte que la taille de la boîte de la légende seront petites.
- Pour les nouveaux matplotlib versions, cette réponse montre comment définir matplotlib pour automatiquement déterminer où placer la légende, sans interférer avec les parcelles.
- A la même question et a trouvé ce bon exemple qui a fonctionné pour moi "out of the box": matplotlib.org/1.3.1/users/legend_guide.html
- Cette réponse a plus de profondeur
https://stackoverflow.com/a/43439132/52074
. et le fait avec deux lignes de code! le +1200 upvoted réponse est bonne aussi, mais je l'ai trouvé à moins générique. - "automatiquement déterminer où placer la légende, sans interférer avec les parcelles" Dans certains cas, lorsque la parcelle a beaucoup de courbes, il est malheureusement impossible. Dans ces cas, l'utilisateur peut vouloir placer manuellement la légende, et en effet le mettre en dehors de la zone de traçage. Je vais avoir des difficultés avec un tel complot dès maintenant.
- btw, la liste de choix de la ldc : le meilleur; en haut à droite; en haut à gauche; en bas à gauche; en bas à droite; à droite; au centre gauche; au centre, à droite; en bas au centre; en haut au centre; centre;
- utilisez simplement
.legend
sur lefig
au lieu de faireplt.legend
Vous devez vous connecter pour publier un commentaire.
Vous pouvez rendre le texte de la légende est plus petite par la création de propriétés de police:
plot1
dans cette réponse?legend
dans cette réponse?plt.legend(fontsize='small')
Il y a un certain nombre de façons de faire ce que vous voulez. Pour ajouter à ce que @inalis et @Navi déjà dit, vous pouvez utiliser le
bbox_to_anchor
argument mot-clé à la place de la légende partiellement en dehors des axes et/ou de diminuer la taille de la police.Avant de vous envisagez de diminuer la taille de la police (qui peut faire des choses terriblement dur à lire), essayez de jouer avec la mise en place de la légende dans différents endroits:
Donc, nous allons commencer par un exemple générique:
Si nous faisons la même chose, mais l'utilisation de la
bbox_to_anchor
argument mot-clé nous permet de changer la légende légèrement en dehors des axes limites:De même, vous pouvez faire de la légende à l'horizontale et/ou le mettre en haut de la figure (je suis aussi en tournant sur des coins arrondis et une simple ombre portée):
Alternativement, vous pouvez diminuer la taille de la trame actuelle de largeur, et de mettre la légende entièrement à l'extérieur de l'axe de la figure:
Et d'une manière similaire, vous pouvez diminuer la taille de la parcelle à la verticale, et de le mettre à l'horizontale de la légende au bas:
Ont un look à la matplotlib légende guide. Vous pouvez également jeter un oeil à
plt.figlegend()
. Espérons que cela vous aide un peu, de toute façon!bbox_to_anchor
est un n-uplet de 4 flotteurs (x, y, largeur, hauteur de la bbox), ou un n-uplet de 2 flotteurs (x, y) normalisé des axes de coordonnées. "legend = ax.legend()
et plus tardfig.savefig(bbox_extra_artists=(legend,))
figure = plt.figure(1)\n figure, axisArr = plt.subplots(4, 1, figsize=(8.27, 11.70), sharex=True)\n box = axisArr[0].get_position()\n axisArr[0].set_position([box.x0, box.y0, box.width * 0.5, box.height])\n axisArr[0].legend(loc="center right", bbox_to_anchor=(1, 0.5), prop={'size': 6})
Shrink current axis by
. la raison que je dis que la clé est parce que l'exemple de la documentation de code N'montrer quelque chose de similaire... mais cache l'ensemble de lashrink
partie en faisant unplt.subplot(223)
qui a effectivement réduit la taille de la parcelle de 50%.plt
: vous pouvez faire beaucoup de manipulations avec l'habitudeplt
mais ensuiteshrink axes
partie du code, vous pouvez obtenir le courant de l'axe en faisantax = plt.gca()
.Plaçant la légende (
bbox_to_anchor
)Une légende est placée à l'intérieur de la boîte englobante de la axes à l'aide de la
loc
argumentplt.légende
.E. g.
loc="upper right"
lieux de la légende dans le coin supérieur droit de la boîte englobante, qui, par défaut, les extensions de(0,0)
à(1,1)
dans les axes de coordonnées (ou dans la boîte englobante de la notation(x0,y0, width, height)=(0,0,1,1)
).À la place de la légende à l'extérieur de l'axe de la boîte englobante, on peut spécifier un tuple
(x0,y0)
des axes de coordonnées du coin inférieur gauche de la légende.Cependant, plus polyvalent, approche serait de spécifier manuellement la boîte englobante dans laquelle la légende doit être placé, à l'aide de la
bbox_to_anchor
argument. On peut se limiter à fournir uniquement le(x0,y0)
partie de la bbox. Cela crée un zéro span boîte, dont la légende se développer dans la direction donnée par leloc
argument. E. g.lieux de la légende à l'extérieur de la axes, tels que le coin supérieur gauche de la légende est à la position
(1.04,1)
dans les axes de coordonnées.D'autres exemples sont donnés ci-dessous, où de plus l'interaction entre les différents arguments comme
mode
etncols
sont affichés.De détails sur la façon d'interpréter le 4-tuple argument
bbox_to_anchor
, comme dansl4
, peut être trouvé dans cette question. Lemode="expand"
se développe la légende horizontalement à l'intérieur de la boîte englobante donné par le 4-n-uplet. Pour une verticalement élargi la légende, voir cette question.Parfois, il peut être utile de préciser la boîte englobante dans la figure coordonnées à la place des axes de coordonnées. Ceci est illustré dans l'exemple
l5
à partir de ci-dessus, où labbox_transform
argument est utilisé pour mettre la légende dans le coin inférieur gauche de la figure.Post-traitement
Avoir placé la légende en dehors de la axes conduit souvent à la situation indésirable qu'il est complètement ou partiellement en dehors de la figure de la toile.
Des Solutions à ce problème sont:
Ajuster l'intrigue secondaire paramètres
On peut ajuster l'intrigue secondaire des paramètres tels, que les axes de prendre moins d'espace à l'intérieur de la figure (et ainsi laisser plus de place à la légende) à l'aide de
plt.subplots_adjust
. E. g.laisse 30% de l'espace sur le côté droit de la figure, où l'on pourrait placer la légende.
Disposition serrée
À l'aide de
plt.tight_layout
Permet de régler automatiquement l'intrigue secondaire de paramètres tels que les éléments de la figure s'asseoir serré contre la figure bords. Malheureusement, la légende n'est pas pris en compte dans cet automatisme, mais nous pouvons fournir un rectangle que l'ensemble des sous-parcelles de la zone (y compris les étiquettes) se place dans.Enregistrement de la figure avec
bbox_inches = "tight"
L'argument
bbox_inches = "tight"
àplt.savefig
peut être utilisé pour enregistrer la figure de telle sorte que tous artiste sur la toile (y compris la légende) sont aptes sauvé de la zone. Si nécessaire, la figure, la taille est ajustée automatiquement.Une façon de régler automatiquement l'intrigue secondaire de position tels que la légende s'adapte à l'intérieur de la toile sans changer la figure de la taille peut être trouvé dans cette réponse: La création de la figure avec la taille exacte et la pas de rembourrage (et la légende en dehors des axes)
Comparaison entre les cas décrits ci-dessus:
Alternatives
Une figure de légende
On peut utiliser une légende de la figure à la place des axes,
matplotlib.figure.Figure.légende
. Cela est devenu particulièrement utile pour matplotlib version >=2.1, où aucun des arguments spéciaux sont nécessairespour créer une légende pour tous les artistes, dans les différents axes de la figure. La légende est placée à l'aide de la
loc
argument, semblable à la façon dont il est placé à l'intérieur d'un des axes, mais en référence à la figure d'ensemble - par conséquent, il sera à l'extérieur de la axes un peu automatiquement. Il ne reste qu'à ajuster les intrigues secondaires tels qu'il n'y a pas de chevauchement entre la légende et les axes. Ici, le point de "Ajuster l'intrigue secondaire paramètres" à partir de ci-dessus vous seront utiles. Un exemple:Légende à l'intérieur dédié intrigue secondaire axes
Une alternative à l'utilisation de
bbox_to_anchor
serait de placer la légende dans son intrigue secondaire axes (lax
).Depuis la légende intrigue secondaire doit être plus petite que la parcelle, nous pouvons utiliser
gridspec_kw={"width_ratios":[4,1]}
à des axes de création.Nous ne pouvons cacher les axes
lax.axis("off")
mais tout de même mettre une légende. La légende des poignées et des étiquettes doivent obtenu à partir de la véritable intrigue viah,l = ax.get_legend_handles_labels()
, et peut ensuite être fourni à la légende dans lalax
intrigue secondaire,lax.legend(h,l)
. Un exemple complet est ci-dessous.Ce qui produit une parcelle, qui est visuellement assez similaires à celles de la parcelle à partir de ci-dessus:
On peut aussi utiliser les premiers axes de placer la légende, mais l'utilisation de la
bbox_transform
de la légende des axes,Dans cette approche, nous n'avons pas besoin d'obtenir la légende des poignées à l'extérieur, mais nous avons besoin de spécifier le
bbox_to_anchor
argument.Plus de lectures et notes:
loc
argument peut prendre des chiffres à la place des cordes, qui font des appels de courte, cependant, ils ne sont pas très définies de manière intuitive les uns aux autres. Voici la cartographie de référence:fig.tight_layout
. Si vous utilisezplt.subplots
pour créer les axes, juste lui donner quelque chose commegridspec_kw={'height_ratios': [100, 1]}
(ou width_ratios) ainsi, la légende des axes est minuscule... Puisfig.tight_layout()
permettra de l'étendre à d'ajustement. Au moins pour matplotlib 3.0.3.Appelez simplement
legend()
l'appel après l'plot()
appeler comme ceci:Résultats ressemblerait à quelque chose comme ceci:
Réponse courte: vous pouvez utiliser
bbox_to_anchor
+bbox_extra_artists
+bbox_inches='tight'
.Plus de réponses:
Vous pouvez utiliser
bbox_to_anchor
de spécifier manuellement l'emplacement de la boîte de la légende, comme d'autres personnes l'ont souligné dans les réponses.Cependant, l'habitude de problème, c'est que la boîte de la légende est coupée, par exemple:
Afin de prévenir la légende de la boîte de prise en recadrée, lorsque vous enregistrez la figure, vous pouvez utiliser les paramètres
bbox_extra_artists
etbbox_inches
demandersavefig
inclure recadrée éléments dans l'image enregistrée:fig.savefig('image_output.png', bbox_extra_artists=(lgd,), bbox_inches='tight')
Exemple (j'ai seulement changé la dernière ligne ajouter 2 paramètres à
fig.savefig()
):Je souhaite que matplotlib serait nativement permettre à l'extérieur de l'emplacement de la boîte de la légende comme Matlab ne:
bbox_inches='tight'
fonctionne parfaitement pour moi, même sans bbox_extra_artistÀ la place de la légende à l'extérieur de la zone de traçage, de l'utilisation
loc
etbbox_to_anchor
mots-clés delegend()
. Par exemple, le code suivant place la légende à droite de la zone de traçage:Pour plus d'info, voir le légende guide
plt.tight_layout()
?En plus de toutes les excellentes réponses ici, les nouvelles versions de
matplotlib
etpylab
peut automatiquement déterminer où placer la légende, sans interférer avec les parcelles, si possible.Cela va automatiquement placer la légende à l'écart à partir des données si possible!
Cependant, si il n'y a pas de place pour mettre la légende sans superposer les données, alors vous aurez envie d'essayer l'une des autres réponses, à l'aide de
loc="best"
ne seront jamais mettre la légende à l'extérieur de l'intrigue.Réponse courte: Invoquer déplaçable sur la légende et de manière interactive le déplacer où vous le souhaitez:
Réponse longue: Si vous préférez à la place de la légende de manière interactive/manuellement plutôt que de la programmation, vous pouvez basculer de selection du mode de la légende de sorte que vous pouvez le glisser où vous voulez. Vérifiez l'exemple ci-dessous:
Pas exactement ce que vous avez demandé, mais je trouve que c'est une alternative pour le même problème.
Rendre la légende semi-transparant, comme suit:
Faire avec:
Comme indiqué, vous pouvez également placer la légende dans l'intrigue, ou légèrement décalé vers le bord, aussi bien. Voici un exemple d'utilisation de la Plotly l'API Python, faite avec un IPython Notebook. Je suis sur l'équipe.
Pour commencer, vous aurez envie d'installer les paquets nécessaires:
Ensuite, installez Plotly:
Cela crée votre graphique, et vous permet une chance de garder la légende au sein de l'intrigue elle-même. La valeur par défaut pour la légende si elle ne l'est pas est de le placer dans l'intrigue, comme illustré ici.
Pour une alternative de placement, vous pouvez aligner le bord de la graphique et de la frontière de la légende, et de supprimer les frontières pour un plus étroit.
Vous pouvez vous déplacer et re-style de la légende et le graphique du code, ou avec l'interface graphique. Pour déplacer la légende, vous disposez des options suivantes pour la position de la légende à l'intérieur du graphique en attribuant des valeurs de x et y <= 1. E. g :
{"x" : 0,"y" : 0}
-- Bas À Gauche{"x" : 1, "y" : 0}
-- Bas À Droite{"x" : 1, "y" : 1}
-- En Haut À Droite{"x" : 0, "y" : 1}
-- En Haut À Gauche{"x" :.5, "y" : 0}
-- Bas Au Centre{"x": .5, "y" : 1}
-- En Haut Au CentreDans ce cas, nous choisissons le coin supérieur droit,
legendstyle = {"x" : 1, "y" : 1}
, également décrite dans la documentation:Quelque chose le long de ces lignes a fonctionné pour moi. Départ avec un peu de code de Joe, cette méthode permet de modifier la largeur de la fenêtre d'adapter automatiquement une légende à droite de la figure.
mgr.window.wm_geometry(...)
avecmgr.window.setFixedWidth(winWidthNew)
.fig.set_size_inches(...)
prend en charge le redimensionnement vous avez besoin.Vous pouvez également essayer
figlegend
. Il est possible de créer une légende, indépendante de toute Axes de l'objet. Toutefois, vous devrez peut-être créer quelques "factice" Chemins pour s'assurer que la mise en forme des objets est transmis correctement.Voici un exemple de la matplotlib tutoriel trouvé ici. C'est l'un des plus simples, des exemples, mais j'ai ajouté de la transparence de la légende et a ajouté plt.show() de sorte que vous pouvez les coller dans le shell interactif et d'obtenir un résultat:
La solution qui a fonctionné pour moi quand j'ai eu énormément de légende a été à l'utilisation supplémentaire d'image vide de mise en page.
Dans l'exemple suivant j'ai fait 4 lignes et au fond j'ai de la parcelle de l'image avec un décalage de la légende (bbox_to_anchor), à la tête de ne pas vous couper.
Voici une autre solution, similaire à l'ajout d'
bbox_extra_artists
etbbox_inches
, où vous n'avez pas à avoir de vos artistes supplémentaires dans le cadre de votresavefig
appel. Je suis venu avec ce depuis que j'ai la plupart de mes intrigue à l'intérieur des fonctions.Au lieu d'ajouter l'ensemble de vos ajouts à la boîte englobante lorsque vous voulez écrire, vous pouvez les ajouter à l'avance de l'heure à la
Figure
's artistes. À l'aide de quelque chose de semblable à Franck Dernoncourt de la réponse ci-dessus:Voici le générés parcelle.
ne sais pas si vous avez déjà réglé votre problème...oui, probablement, mais...
J'ai simplement utilisé de la chaîne "à l'extérieur" pour l'emplacement, comme dans matlab.
J'ai importé pylab de matplotlib.
voir le code comme suit:
Cliquez pour voir l'intrigue