Déplacer et redimensionner des légendes-box dans matplotlib

Je suis la création de parcelles à l'aide de Matplotlib que je enregistrer en tant que format SVG, à l'exportation .pdf + .pdf_tex à l'aide d'Inkscape, et comprennent les .pdf_tex fichier dans un document LaTeX.

Cela signifie que je peux l'entrée de LaTeX de commandes dans les titres, les légendes, etc., en donnant une image comme ceci
Déplacer et redimensionner des légendes-box dans matplotlib

qui rend comme ça quand je l'utilise dans mon document LaTeX. Notez que la police pour les numéros sur les axes de changement, et le LaTeX-le code de la légende est compilé:

Déplacer et redimensionner des légendes-box dans matplotlib

Code de la parcelle (comment exporter au format SVG ne sont pas présentées ici, mais peut être montré sur demande):

import numpy as np
x = np.linspace(0,1,100)
y = x**2

import matplotlib.pyplot as plt
plt.plot(x, y, label = '{\\footnotesize $y = x^2$}')
plt.legend(loc = 'best')
plt.show()

Le problème est, comme vous pouvez le voir, que l'alignement et la taille de la zone autour de la légende est fausse. C'est parce que la taille du texte de l'étiquette change lorsque l'image est transmise par Inkscape + pdflatex (parce que \footnotesize etc. disparaît, et la taille de la police des changements).

J'ai compris que je peux choisir le placement de l'étiquette, soit

plt.label(loc = 'upper right')

ou si je veux plus de contrôle que je peux utiliser

plt.label(bbox_to_anchor = [0.5, 0.2])

mais je n'ai pas trouvé de façon de faire de la zone autour de l'étiquette plus petite. Est-ce possible?

Une option de remplacement de la taille de la boîte est de supprimer le contour de la boîte, en utilisant quelque chose comme

legend = plt.legend()
legend.get_frame().set_edgecolor('1.0')

et puis en déplaçant l'étiquette à l'endroit où je le veux. Dans ce cas, je voudrais être en mesure de définir le placement de l'étiquette, tout d'abord laisser python/matplotlib place à l'aide de

plt.label(loc = 'upper right')

et par exemple, puis en le déplaçant un peu vers la droite. Est-ce possible? J'ai essayé d'utiliser get_bbox_to_anchor() et set_bbox_to_anchor(), mais n'arrive pas à le faire fonctionner.

OriginalL'auteur Filip S. | 2014-04-23