2011-10-29 33 views
12

Estoy tratando de alinear correctamente las entradas en una leyenda de ejes matplotlib (de forma predeterminada están alineadas a la izquierda), pero parece que no se puede encontrar ninguna forma de hacerlo. La configuración que tengo es a continuación:Alineación de texto en una leyenda de Matplotlib

(He añadido los datos y etiquetas a my_fig ejes utilizando comandos() la ax.plot)

ax = my_fig.get_axes()[0] 
legend_font = FontProperties(size=10) 
ax.legend(prop=legend_font, num_points=1, markerscale=0.5) 

Hay una lista de argumentos leyenda de palabras clave en la documentación para matplotlib Axes , pero no parece haber ninguna manera directa de establecer la alineación de las entradas de leyenda allí. ¿Alguien sabe de una forma de puerta trasera de hacer esto? Gracias.

EDIT:

Para aclarar lo que estoy tratando de lograr, en este momento mi leyenda parece:

Maneuver: 12-OCT-2011 12:00 UTC 

Bias: 14-OCT-2011 06:00 UTC 

quiero que se vea como:

Maneuver: 12-OCT-2011 12:00 UTC 

    Bias: 14-OCT-2011 06:00 UTC 
+1

¿El texto de su etiqueta incluye líneas múltiples? Si es así, puede usar label_text.set_multialignment ('right') –

+0

No estoy seguro de entender lo que quiere decir. Para las etiquetas, tengo una breve descripción y fecha. Entonces, en este momento, la leyenda tiene las descripciones apiladas y alineadas a la izquierda, lo que me gustaría es que todas las fechas se apilen (alineadas a la derecha). He editado mi mensaje principal con una ilustración. – jeremiahbuddha

+0

Como solución temporal, puede rellenarlos con espacios (siempre que esté utilizando una fuente monoespaciada) –

Respuesta

15

La puerta trasera que está buscando es la siguiente:

# get the width of your widest label, since every label will need 
# to shift by this amount after we align to the right 
shift = max([t.get_window_extent().width for t in legend.get_texts()]) 
for t in legend.get_texts(): 
    t.set_ha('right') # ha is alias for horizontalalignment 
    t.set_position((shift,0)) 
+2

¡Gritar! Me acabo de dar cuenta de que usted es el Paul que conocí en el sprint de IPython en PyCon este año. Finalmente me estoy dando tiempo para codificar esta respuesta, ¡gracias! – jeremiahbuddha

8

He intentado que el ejemplo funcione, pero no pude.

Al menos desde matplotlib versión 1.1.1 (quizás antes) necesitamos una instancia dedicada de renderizador. Cuide su backend que define el renderizador. Dependiendo del backend, la salida puede verse bien en la pantalla pero triste como PDF.

# get the width of your widest label, since every label will need 
#to shift by this amount after we align to the right 
renderer = figure.canvas.get_renderer() 
shift = max([t.get_window_extent(renderer).width for t in legend.get_texts()]) 
for t in legend.get_texts(): 
    t.set_ha('right') # ha is alias for horizontalalignment 
    t.set_position((shift,0)) 
Cuestiones relacionadas