2013-03-26 11 views
16

W matplotlib, w jaki sposób mogę dostosować wyrównanie tytułu legendy? Jest zawsze wyśrodkowany, ale potrzebuję go wyrównanego do legendy. Próbowałem zmienić wyrównanie artysty tekstowego tytułu, które nie ma żadnego efektu. Szczegóły w następującym przykładzie:matplotlib: wyrównanie tytułu legendy

from pylab import * 

x = linspace(0, 1) 
plot(x, x, label="1") 
plot(x, x**2, label="2") 
plot(x, x**3, label="3") 
plot(x, sqrt(x), label="square root") 

l = legend(title="Title", loc="best") 
l.get_title().set_ha("left")    # <== does not work 

show() 

Pytanie sprowadza się do tego, co i kto kontroluje punkt kontrolny wyrównania tytułu? Zmiana wyrównania na "prawo" lub "centrum" ma zauważalny efekt. Druga uwaga: w przypadku długich ciągów znaków punkt kontrolny przesuwa się do lewej krawędzi pola legendy ...

+0

Tekst tytułu jest domyślnie "wyrównany do lewej strony". Punkt zakotwiczenia wyrównania znajduje się w środku pola legendy. Czy można określić inny punkt kontrolny? Może jest jakaś instancja VPacker lub HPacker związana z Legend? – Erwin411

+0

Dla mojej obecnej sprawy mam rozwiązanie: po prostu powiedz 'l.get_title(). Set_ha (" center ")'. Tekst jest następnie wyśrodkowany z tajemniczym punktem kontrolnym (który jest mniej więcej między uchwytami i tekstami etykiet) i wygląda dobrze. Dla '' Bardzo bardzo długiego tytułu '', jednak punkt kontrolny przesuwa się na lewą krawędź pola ... – Erwin411

+0

Gdyby te same pytania co 'set_ha ('left')' nie zadziałały –

Odpowiedz

5

Myślę, że musisz przemieścić obiekt Text, używając metody set_position((x, y)). Jednostki x i y są pikselami, więc musisz poeksperymentować z wartościami, które wyglądają dobrze, lub użyć Transform. Nie jestem pewna, która kombinacja Transforms może być najbardziej przydatna.

Tak w skrócie, coś jak to może działać:

l.get_title().set_position((-10, 0)) # -10 is a guess 
+3

Dzięki! Funkcja set_position() rzeczywiście przenosi tytuł. Nie chciałbym jednak sztywno przesuwać przesunięcia, ale raczej obliczać je z zakresu skrzynek. Wydaje się to być dość zaangażowane ... – Erwin411

6

można wyrównać kompletny pole legendy ustawienia leg._legend_box.align. To wyrównuje wszystko w polu legendy, ale efekt jest pożądany, aby tytuł znajdował się po obu stronach pola, a nie w środku.

  • Lewy wyrównane

    leg = plt.legend(title="Title") 
    leg._legend_box.align = "left" 
    

    enter image description here

  • Prawy wyrównane

    leg = plt.legend(title="Title") 
    leg._legend_box.align = "right" 
    

    enter image description here

Powiązane problemy