Verschieben und ändern der Größe Legenden-box in matplotlib
Ich bin erstellen Diagramme mit Matplotlib, dass ich speichern Sie als SVG exportieren .pdf + .pdf_tex mit Inkscape, und enthalten die .pdf_tex-Datei in ein LaTeX-Dokument.
Dies bedeutet, dass ich die Eingabe der LaTeX-Befehle in überschriften, Legenden usw.., dass ein Bild wie dieses
leistet, wie diese, wenn ich es in mein LaTeX-Dokument. Beachten Sie, dass die schriftart für die zahlen auf den Achsen zu ändern, und der LaTeX-code in der Legende kompiliert wird:
Code für die Handlung (wie der export nach SVG wird hier nicht gezeigt, aber gezeigt werden können, auf Anfrage):
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()
Das problem ist, wie Sie sehen können, dass die Ausrichtung und die Größe des Rahmens um die Legende falsch ist. Dies ist, weil die Größe der text des Labels ändert, wenn das Bild Durchlaufen Inkscape + pdflatex (wegen \footnotesize
etc. verschwindet, und die Schriftgröße ändert).
Habe ich herausgefunden, dass ich wählen kann, die Platzierung des Labels, indem entweder
plt.label(loc = 'upper right')
oder wenn ich mehr Kontrolle haben möchten, die ich verwenden kann
plt.label(bbox_to_anchor = [0.5, 0.2])
aber ich habe nicht gefunden, einen Weg, um die box um das label kleiner. Ist das möglich?
Eine alternative zu der box kleiner ist, entfernen Sie den Umriss der box mit so etwas wie
legend = plt.legend()
legend.get_frame().set_edgecolor('1.0')
und bewegen Sie anschließend das Etikett auf, wo ich es will. In diesem Fall würde ich mag, um in der Lage sein, die Platzierung des Labels, indem zuerst lassen python/matplotlib legen Sie es mit
plt.label(loc = 'upper right')
und dann beispielsweise verschieben es etwas nach rechts. Ist das möglich? Ich habe versucht mit get_bbox_to_anchor()
und set_bbox_to_anchor()
, aber kann nicht scheinen, um es zu arbeiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie bewegen eine Legende, nach der automatisch platzieren Sie es durch zeichnen, und dann immer die bbox position. Hier ist ein Beispiel:
legendPatch
vor, obwohl, warum nicht erwähnt in der docs?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
Können Sie die
bbox_to_anchor
undbbox_transform
Parameter zu helfen, Sie setzen der Anker für Ihre eigene Legende:Beachten Sie, dass
(1.1, 1.1)
sind in den Achsen-Koordinaten in diesem Beispiel. Wenn Sie möchten, um die Daten, Koordinaten, die Sie haben zu verwendenbbox_transform=ax.transData
statt.transAxes
ist eigentlich Standard gemäß der doc.transAxes
ist die Standard - ... können Sie vielleicht passieren zubbox_to_achor
ein Tupel mit 4 floats (x, y, Breite, Höhe), die Ihnen mehr Kontrolle über die bbox Verhalten...