Mueve y redimensiona el cuadro de leyendas en matplotlib

Estoy creando gráficos utilizando Matplotlib que guardo como SVG, exporto a .pdf + .pdf_tex utilizando Inkscape e incluyo el archivo .pdf_tex en un documento LaTeX.

Esto significa que puedo ingresar comandos LaTeX en títulos, leyendas, etc., dando una imagen como esta trama

que se reproduce así cuando lo uso en mi documento LaTeX. Observe que la fuente para los números en los ejes cambia, y se comstack el código LaTeX en la leyenda:

parcela renderizada utilizando LaTeX

Código para el gráfico (cómo exportar a SVG no se muestra aquí, pero se puede mostrar a petición):

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() 

El problema es, como puede ver, que la alineación y el tamaño del cuadro alrededor de la leyenda son incorrectos. Esto se debe a que el tamaño del texto de la etiqueta cambia cuando la imagen pasa a través de Inkscape + pdflatex (porque desaparece \footnotesize etc., y el tamaño de la fuente cambia).

Me he dado cuenta de que puedo elegir la ubicación de la etiqueta por cualquiera

 plt.label(loc = 'upper right') 

o si quiero mas control puedo usar

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

pero no he encontrado ninguna forma de hacer que la caja alrededor de la etiqueta sea más pequeña. es posible?

Una alternativa para hacer el cuadro más pequeño es eliminar el contorno del cuadro usando algo como

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

y luego mover la etiqueta a donde la quiero. En ese caso, me gustaría poder establecer la ubicación de la etiqueta dejando que Python / matplotlib la coloque usando

 plt.label(loc = 'upper right') 

Y luego, por ejemplo, moviéndolo un poco a la derecha. es posible? He intentado usar get_bbox_to_anchor() y set_bbox_to_anchor() , pero parece que no puedo hacer que funcione.

Puede mover una leyenda después de colocarla automáticamente dibujándola y luego obteniendo la posición de bbox. Aquí hay un ejemplo:

 import matplotlib.pyplot as plt import numpy as np # Plot data x = np.linspace(0,1,100) y = x**2 fig = plt.figure() ax = fig.add_subplot(221) #small subplot to show how the legend has moved. # Create legend plt.plot(x, y, label = '{\\footnotesize \$y = x^2\$}') leg = plt.legend( loc = 'upper right') plt.draw() # Draw the figure so you can find the positon of the legend. # Get the bounding box of the original legend bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes) # Change to location of the legend. xOffset = 1.5 bb.x0 += xOffset bb.x1 += xOffset leg.set_bbox_to_anchor(bb, transform = ax.transAxes) # Update the plot plt.show() 

leyenda movida después del primer dibujo

Puede usar los parámetros bbox_to_anchor y bbox_transform para ayudarlo a configurar el ancla para su leyenda:

 ax = plt.gca() plt.legend(bbox_to_anchor=(1.1, 1.1), bbox_transform=ax.transAxes) 

Tenga en cuenta que (1.1, 1.1) están en las coordenadas de los ejes en este ejemplo. Si desea utilizar las coordenadas de datos, debe utilizar bbox_transform=ax.transData en bbox_transform=ax.transData lugar.