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
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é:
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
Vous devez vous connecter pour publier un commentaire.
Vous pouvez déplacer une légende après plaçant automatiquement par le dessin, puis de la bbox position. Voici un exemple:
legendPatch
avant par contre, pourquoi n'est-il pas mentionné dans le docs?Je ne sais pas. J'ai appris ce truc de la Matplotlib-utilisateurs de liste d'email, mais je ne trouve pas le post. J'espère que quelques un d'autre le fera carillon avec une réponse plus complète!
cela ne fonctionne pas avec matplotlib version 1.5.1+1304.gc0728d2'
matplotlib/transforms.py in get_points(self) 1101 # same. 1102 points = self._transform.transform( -> 1103 [[p[0, 0], p[0, 1]], 1104 [p[1, 0], p[0, 1]], 1105 [p[0, 0], p[1, 1]], TypeError: list indices must be integers, not tuple
J'ai modifié la réponse, maintenant il fonctionne comme prévu sur matplotlib 1.5.1.
OriginalL'auteur Molly
Vous pouvez utiliser le
bbox_to_anchor
etbbox_transform
paramètres pour vous aider à régler le point d'ancrage pour votre légende:Noter que
(1.1, 1.1)
sont dans les axes de coordonnées dans cet exemple. Si vous souhaitez utiliser les données de coordonnées que vous devez utiliserbbox_transform=ax.transData
à la place.transAxes
est en fait par défaut en fonction de la doc.oui, le
transAxes
est la valeur par défaut... vous pouvez peut-être passer àbbox_to_achor
un tuple avec 4 chars (x, y, largeur, hauteur), ce qui devrait vous donner plus de contrôle sur la bbox comportement...OriginalL'auteur Saullo G. P. Castro