2011-10-29 16 views
12

Sto cercando di allineare a destra le voci in una legenda degli assi matplotlib (per impostazione predefinita sono allineate a sinistra), ma non riesco a trovare alcun modo per farlo. La configurazione che ho è di seguito:Allineamento del testo in una legenda Matplotlib

(ho aggiunto i dati e le etichette per my_fig assi utilizzando il comando() l'ax.plot)

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

C'è una lista di argomenti leggenda parola chiave nella documentazione per matplotlib Axes , ma non sembra esserci un modo semplice per impostare l'allineamento delle voci della legenda lì. Qualcuno sa di un modo backdoor di fare questo? Grazie.

EDIT:

Per chiarire quello che sto cercando di realizzare, in questo momento il mio mito appare come:

Maneuver: 12-OCT-2011 12:00 UTC 

Bias: 14-OCT-2011 06:00 UTC 

voglio farlo sembrare come:

Maneuver: 12-OCT-2011 12:00 UTC 

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

Il testo dell'etichetta include più linee? Se è così puoi usare label_text.set_multialignment ('right') –

+0

Non sono sicuro di capire cosa intendi. Per le etichette, ho una breve descrizione e una data. Quindi adesso, la legenda ha le descrizioni raggruppate e allineate a sinistra, quello che vorrei è che tutte le date siano impilate (allineate a destra). Ho modificato il mio messaggio principale con un'illustrazione. – jeremiahbuddha

+0

Per ovviare al problema, è possibile applicarli con spazi (a condizione che si stia utilizzando il carattere monospace) –

risposta

15

La backdoor che stai cercando è la seguente:

# 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

Gridare! Ho appena realizzato che tu sei il Paul che ho incontrato allo sprint di IPython a PyCon quest'anno. Sto finalmente girando per scrivere questa risposta, grazie! – jeremiahbuddha

8

Ho cercato di ottenere l'esempio di lavoro, ma non ho potuto.

Almeno poiché la versione 1.1.1 (forse precedente) di matplotlib necessita di un'istanza di renderer dedicata. Prenditi cura del tuo back-end che definisce il renderer. A seconda del back-end, l'output può sembrare buono sullo schermo ma triste come 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)) 
Problemi correlati