web-dev-qa-db-fra.com

Comment spécifier la position de la légende dans matplotlib en coordonnées graphiques

Je connais le mot-clé bbox_to_anchor et ce fil, qui suggère très utilement comment placer manuellement la légende:

Comment sortir la légende de l'intrigue

Cependant, j'aimerais utiliser les coordonnées de mes axes x et y dans le graphique pour spécifier la position de la légende (à l'intérieur du tracé), car je pourrais avoir besoin de déplacer la figure dans une grande figure avec un environnement d'axe différent, et je ne veux pas jouer manuellement avec ces coordonnées à chaque fois que je fais cela. Est-ce possible?

Edit: Un petit exemple est ici:

import numpy as n
f, axarr = plt.subplots(2,sharex=True)
axarr[1].set_ylim([0.611,0.675])
axarr[0].set_ylim([0.792,0.856]) 
axarr[0].plot([0, 0.04, 0.08],n.array([ 0.83333333,  0.82250521,0.81109048]), label='test1') 
axarr[0].errorbar([0, 0.04, 0.08],n.array([ 0.8,  0.83,   0.82]),n.array([0.1,0.1,0.01]), label='test2') 
axarr[1].plot([0, 0.04, 0.08],n.array([ 0.66666667,  0.64888304,  0.63042428]))
axarr[1].errorbar([0, 0.04, 0.08],n.array([ 0.67,  0.64,  0.62]),n.array([ 0.01,  0.05,  0.1]))
axarr[0].legend(bbox_to_anchor=(0.04, 0.82, 1., .102),labelspacing=0.1,       handlelength=0.1, handletextpad=0.1,frameon=False, ncol=4, columnspacing=0.7)

enter image description here

Je pense que ce qui me dérange, c'est que la légende ne commence pas réellement à 0,82, et même pour mon intrigue plus grande (avec 5 sous-intrigues de ce type), je dois utiliser les coordonnées de la légende bbox_to_anchor = (0.04, 1.15, 1., .102). afin de faire apparaître la légende sur les coordonnées (0.02, 0.83). Mais peut-être que je me trompe?

24
mzzx

Vous pouvez changer l'emplacement de la légende en utilisant l'argument loc. https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.legend

import matplotlib.pyplot as plt

plt.subplot(211)
plt.plot([1,2,3], label="test1")
plt.plot([3,2,1], label="test2")
# Place a legend above this subplot, expanding itself to
# fully use the given bounding box.
plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,
           ncol=2, mode="expand", borderaxespad=0.)

plt.subplot(223)
plt.plot([1,2,3], label="test1")
plt.plot([3,2,1], label="test2")
# Place a legend to the right of this smaller subplot.
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

plt.show()
4
Drahoš Maďar

En plus du message de @ ImportanceOfBeingErnest, j'utilise la ligne suivante pour ajouter une légende en position absolue dans un tracé.

plt.legend(bbox_to_anchor=(1.0,1.0),\
    bbox_transform=plt.gcf().transFigure)

Pour des raisons inconnues, bbox_transform=fig.transFigure ne fonctionne pas avec moi.

2
llin